diff --git a/.gitignore b/.gitignore index 67da0f8d..d0eae807 100644 --- a/.gitignore +++ b/.gitignore @@ -168,3 +168,15 @@ docs/output demo/.nuget/ *.zip unittests/MapWinGISTests/AkkerwebTests.cs +*.exe +*.mwd +*.mwx +unittests/packages/ +unittests/.vs/unittests/v15/Server/sqlite3/storage.ide +unittests/.vs/unittests/v15/Server/sqlite3/db.lock +docs/.vs/MapWinGis Documentation/v15/Server/sqlite3/storage.ide-wal +docs/.vs/MapWinGis Documentation/v15/Server/sqlite3/storage.ide-shm +docs/.vs/MapWinGis Documentation/v15/Server/sqlite3/storage.ide +docs/.vs/MapWinGis Documentation/v15/Server/sqlite3/db.lock +src/MapWinGIS.vcxproj.filters +unittests/.vs/ diff --git a/demo/MWLite.Core/GeoLocation/GeoLocationHelper.cs b/demo/MWLite.Core/GeoLocation/GeoLocationHelper.cs index 29449001..8d288e47 100644 --- a/demo/MWLite.Core/GeoLocation/GeoLocationHelper.cs +++ b/demo/MWLite.Core/GeoLocation/GeoLocationHelper.cs @@ -27,7 +27,7 @@ public static Extents FindLocation(string query) private static string ResquestLocation(string query) { //var url = "https://maps.googleapis.com/maps/api/geocode/json?address=" + query; - var url = string.Format("http://nominatim.openstreetmap.org/search/{0}?format=json&limit=1", query); + var url = string.Format("https://nominatim.openstreetmap.org/search/{0}?format=json&limit=1", query); var request = (HttpWebRequest)WebRequest.Create(url); request.Referer = "mapwingis.codeplex.com"; diff --git a/docs/AxInterop.MapWinGIS.XML b/docs/AxInterop.MapWinGIS.XML index ab867e79..b4bd2478 100644 --- a/docs/AxInterop.MapWinGIS.XML +++ b/docs/AxInterop.MapWinGIS.XML @@ -9,7 +9,8 @@ Map component for visualization of vector, raster or grid data. Here is a class diagram for the AxMap class: - \dot digraph map_diagram { + \dot + digraph map_diagram { nodesep = 0.3; ranksep = 0.3; splines = ortho; @@ -45,6 +46,30 @@ \dotfile mapgroups.dot Graph description + + + Gets or sets the user defined cursor handle. The handle is a windows cursor handle. + + + + + Gets or sets the object of Tiles class associated with map. + + \new490 Added in version 4.9.0 + + + + Gets FileManager object associated with map. The object is used by AxMap.AddLayerFromFilename methods. + + \new491 Added in version 4.9.1 + + + + Gets or sets the background color of the map. + + When using VB.NET the color is represented as a System.Drawing.Color. + When using VB 6 the color can be an OLE_COLOR or an integer representation of an RGB value. + Draws the content of the back buffer to specified device context. @@ -54,12 +79,42 @@ The width of the resulting image. The height of the resulting image. + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + .NET clients passing ICallback implementation to this property must make respective + class COM visible by setting ComVisible(true) attribute. In fact ComVisible(true) is set by default + for public classes, so it's enough to make sure that it isn't explicitly set to false for the class + or assembly where the class is defined. Otherwise InvalidCastException may occur at runtime. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + Returns the handle of the window of map control. The handle of window. + + + The key may be used by the programmer to store any string data associated with the object. + + + + + Retrieves the last error generated in the object. + + + + + Gets or sets the cursor used with the map. When using crsrUserDefined be sure to set a UDCursorHandle. + + + + + Gets or sets the value which indicates how the control adjust its content after the resizing operations. + + Redraws all layers in the map if the map is not locked. @@ -73,6 +128,13 @@ The new width of the control. The new hight of the control. + + + Gets or sets a value which indicates whether the time of map redraw will be displayed on the screen. + + Only times of full redraws when data layers are drawn anew are displayed. + \new48 Added in version 4.8 + Shows tooltip near the mouse cursor. @@ -80,6 +142,12 @@ Text of the tooltip. The duration of tooltip display. + + + Gets or sets a boolean value which indicate whether control's version number will be displayed on the screen. + + \new48 Added in version 4.8 + Takes snap shot of the contents of the map within the bounds of the specified rectangle, returning an image of the results. @@ -117,6 +185,12 @@ The width of the resulting image inShowVersionNumber pixels. True on success and false otherwise. + + + Gets or sets version number of the control. + + The set part of the property isn't supported. + Retrieves the error message associated with the specified error code. @@ -124,6 +198,14 @@ The error code for which the error message is required. The error message description for the specified error code. + + + Gets or sets tile provider for the map. + + This property is a shortcut for AxMap.Tiles.Provider property. + Setting it to ProviderNone will change AxMap.Tiles.Visible property to false. + \new491 Added in version 4.9.1 + Returns coordinate of the shapefile point closest to specified point on screen. @@ -166,6 +248,59 @@ altogether and call AxMap.Redraw instead ( equivalent to AxMap.Redraw2(tkRedrawType.RedrawAll)). \new491 Added in version 4.9.1 + + + Gets list actions performed by user via interactive shape editor. Provides undo/redo capability. + + \new493 Added in version 4.9.3 + + + + Gets an %Identifier object which holds settings of cmIdentify tools. + + \new493 Added in version 4.9.3 + + + + Gets instance of shape editor class associated with map which stores data entered by interactive editing tools. + + \new493 Added in version 4.9.3 + + + \addtogroup map_interaction Map interaction + Here is a list of properties and methods which affect the way a user interacts with the map. This module is a part of the documentation of AxMap class. + \dot + digraph map_interaction { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Map Interaction" URL="\ref map_interaction"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + + Gets or sets a boolean value which indicate whether map will be redrawn in the course of panning operation. + + The default value is false. Setting this value to true can improve the user experience but + decrease the performance in case large layers are displayed. + \new48 Added in version 4.8 + + + + Gets or sets the cursor mode for the map. + + The cursor mode determines how the map handles mouse click events on the map. The only mode not handled by the map is cmNone. + + + + Gets or sets zoom behaviour for the map control. + + \new491 Added in version 4.9.1 + Zoomes map to display selected shapes of the specified shapefile. @@ -191,6 +326,11 @@ True on success. \new490 Added in version 4.9.0 + + + Checks to see if the map is currently locked or not. + + Locks the window so that any changes will not be displayed until it is unlocked. @@ -199,6 +339,53 @@ The changes of drawing options in the related classes (Shapefile, Labels, etc.) won't cause the redraw of the map even if it's not locked. The state of the lock mode. + + + Gets or sets a boolean value which indicates whether a wait cursor will be displayed on map redraw. + + + + + Gets or sets the speed of zooming with mouse wheel. + + The default values is 0.5. The values in 0.1 - 10.0 range are accepted. The value 1.0 will turn off + the zooming by mouse wheel. + + + + Gets or sets whether the map sends mouse down events. + + + + + Gets or sets whether the map sends mouse move events. + + + + + Gets or sets whether the map sends mouse up events. + + + + + Gets or sets a boolean value which indicates whether the map sends on draw back buffer events. + + + + + Gets or sets whether the map sends the SelectBoxDrag event. + + + + + Gets or sets whether the map sends the SelectBoxFinal event. + + + + + Gets or sets a boolean value which can affect the displaying of the context menus in client code by the right click. + + Zooms the display in by the given factor. @@ -211,6 +398,11 @@ The factor to zoom out by. + + + Gets or sets the factor by which to zoom the view of the map in or out. + + Zooms the map display to the specified layer. @@ -242,6 +434,87 @@ The handle of the layer containing the shape to zoom to. The index of the shape to zoom to. + + + Gets or sets a value indicating whether zoom bar will be displayed on the map. + + Zoom bar can be displayed only if projection of the map is set. Zoom levels + depend upon tile of the current tile provider. + /see AxMap.TileProvider, AxMap.Projection + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether animation will be displayed zooming map in or out. + + Default csAuto value will display animation only if there are no data layers + within visisble extents. Animation also won't be displayed if there are more than 4 + zoom levels between current and target level. + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether animation will be displayed to simulate + inertia after panning operation. + + Default csAuto value will display animation only if there are no data layers + within visisble extents. + \note Mouse panning is somewhat more tricky than the one with smartphone's touch screen, + so some practice may be needed to learn not to stop mouse motion before releasing the button ))) + + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether currently rendered tile buffer should be scaled + and reused during the next redraw. + + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether the legacy 'hand' cursor should be used + for map panning rather than the standard 'NSEW' four-point cursor. + + \new495 Added in version 4.9.5 + + + + Gets or sets the amount of information to be displayed in zoom bar tool tip. + + \new492 Added in version 4.9.2 + + + + Gets or sets a style of zoom box, which is used to select a region with Zoom In tool. + + \new492 Added in version 4.9.2 + + + + Gets or sets minimum zoom level to be used by zoom bar. + + This property won't increase the number of available levels, + if certain levels aren't supported by the provider they still won't be displayed. + \new492 Added in version 4.9.2 + + + + Gets or sets maximum zoom level to be used by zoom bar. + + This property won't increase the number of available levels, + if certain levels aren't supported by the provider they still won't be displayed. + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether to move the mouse click point to the center of the map + when using the Zoom In or Zoom Out tools. + + The default value is False, indicating that the map is not recentered, + but instead keeps the click point at the mouse position and zooms around that point. + \new495 Added in version 4.9.5 + Reverts the last operation performed by user in interactive shape editor. @@ -251,6 +524,21 @@ \new493 Added in version 4.9.3 + \addtogroup map_serialization Map serialization + Here is a list of properties and methods to preserve the state of the map and particular layers. This module is a part of the documentation of AxMap class. + \dot + digraph map_serialization { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Map Serialization" URL="\ref map_serialization"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Serializes the layer settings to the string. @@ -348,6 +636,21 @@ \new48 Added in version 4.8 + \addtogroup map_layer_properties Layer properties + Here is a list of properties common to all data layers. This module is a part of the documentation of AxMap class. + \dot + digraph map_layer_properties { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Layer Properties" URL="\ref map_layer_properties"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Gets maximum zoom at which the layer will be displayed. @@ -549,6 +852,21 @@ The color scheme for the specified layer + \addtogroup map_layer_management Layer management + Here is a list of properties and methods which allow to work with layers of the map. This module is a part of the documentation of AxMap class. + \dot + digraph map_layer { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Layer Management" URL="\ref map_layer_management"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Removes all data from the map and sets its properties to the default state. @@ -628,6 +946,11 @@ The initial position of the layer to be moved. Boolean value representing success when true, failure when false. + + + Gets the number of layers loaded in the map. + + Removes all layers from the map. @@ -718,6 +1041,21 @@ \new493 Added in version 4.9.3 + \addtogroup map_drawing_layers Drawing layers + Here is a list of methods and properties to interact with the drawing layers of the map. This module is a part of the documentation of AxMap class. + \dot + digraph map_drawing_layers { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Drawing Layers" URL="\ref map_drawing_layers"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Replaces the labels associated with the drawing layer. @@ -947,6 +1285,23 @@ \new493 Added in version 4.9.3 + \addtogroup map_shapefile Shapefile visualization + Here is a list of properties for changing appearance of shapefile layer added to the map. + Consider the usage of ShapeDrawingOptions class to access wider set of options. + See Shapefile.DefaultDrawingOptions for details. This module is a part of the documentation of AxMap class. + \dot + digraph map_shapefile { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Shapefile visualization" URL="\ref map_shapefile"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Gets whether the specified layer is drawn with a fill. Only works on polygon shapefiles. @@ -1124,391 +1479,65 @@ The handle of the shapefile layer. The color of stipple. - - + - Gets a boolean value which indicates whether the background of fill stipple for polygon shapefile layer will be transparent. + Sets the color of the polygon stipple for shapefile layer. This property corresponds to the ShapeDrawingOptions.FillBgTransparent property. + This property corresponds to the ShapeDrawingOptions.FillHatchStyle property. The handle of the shapefile layer. - True in case the background is transparent and false otherwise. + The color of stipple. + \see Shapefile.DefaultDrawingOptions - + - Sets a boolean value which indicates whether the background of fill stipple for polygon shapefile layer will be transparent. + Gets a boolean value which indicates whether the background of fill stipple for polygon shapefile layer will be transparent. This property corresponds to the ShapeDrawingOptions.FillBgTransparent property. The handle of the shapefile layer. - True in case the background is transparent and false otherwise. - - - - Sets geographic extents for the map. - - Longitude of center of the screen (degrees). - Latitude of center of the screen (degrees). - Width of displayed extents in kilometres. - Projection for the must be specified in order for this method to work. - True on success. - \new491 Added in version 4.9.1 - - - - Gets known extents. - - Known extents to retrieve. - Extents object. - \new491 Added in version 4.9.1 - - - - Sets geographic extents in decimal degrees for the map. - - Geographic extents in decimal degrees. - True on success. - For operation to succeed, projection must be set for the map (see AxMap.GeoProjection property) - \new490 Added in version 4.9.0 - - - - Converts pixel coordinates to projected map coordinates - - The x pixel coordinate to be converted into the projected x map coordinate. - The y pixel coordinate to be converted into the projected y map coordinate - The projected x map coordinate is returned through this reference parameter. - The projected y map coordinate is returned through this reference parameter. - - - - Converts projected map coordinates into screen pixel units - - The projected x map coordinate to be converted into the x pixel coordinate. - The projected y map coordinate to be converted into the y pixel coordinate. - The pixel x coordinate is returned through this reference parameter - The pixel y coordinate is returned through this reference parameter. - - - - Converts projected map coordinates to decimal degrees (map projection must be specified for this method to work). - - Projected X map coordinate. - Projected Y map coordinate. - Converted longitude in decimal degrees - Converted latitude in decimal degrees - True on success. - \new491 Added in version 4.9.1 - - - - Converts coordinates in decimal degrees to pixel coordinates (map projection must be specified for this method to work). - - X screen coordinate. - Y screen coordinate. - Converted longitude in decimal degrees - Converted latitude in decimal degrees - True on success. - \new491 Added in version 4.9.1 - - - - Converts coordinates in decimal degrees to projected map coordinates (map projection must be specified for this method to work). - - Longitude in decimal degrees. - Latitude in decimal degrees. - Resulting projected X map coordinate. - Resulting Projected Y map coordinate. - True on success. - \new491 Added in version 4.9.1 - - - - Converts pixel coordinates to decimal degrees (map projection must be specified for this method to work). - - Longitude in decimal degrees. - Latitude in decimal degrees. - Converted X screen coordinate. - Converted Y screen coordinate. - True on success. - \new491 Added in version 4.9.1 - - - - Calculates area of polygon taking into account the shape of Earth. - - For the time being only single-part polygons are accepted as input. Calculation are made using - GeographicLib. - Single part polygon shape defined in coordinates of map. - Area of shape in square meters or 0.0 if current map projection doesn't support transformation to WGS84. - \new493 Added in version 4.9.3 - - - - Calculates geodesic distance between 2 points defined in map coordinate system. - - To calculate geodesic distance between 2 points in screen coordinates use AxMap.PixelToProj first. - Calculation are made using GeographicLib. - X coordinate of the first point. - Y coordinate of the first point. - X coordinate of the second point. - Y coordinate of the second point. - Distance between 2 points in meters 0.0 if current map projection doesn't support transformation to WGS84 - \new493 Added in version 4.9.3 - - - - Calculates length of polyline or perimeter of polygon taking into account the shape of Earth. - - For the time being only single-part shapes are accepted as input. Calculation are made using - GeographicLib. - Single part polygon or polyline shape defined in coordinates of map. - Length of polyline or perimeter of polygon in meters or 0.0 if current map projection doesn't support transformation to WGS84. - \new493 Added in version 4.9.3 - - - - Gets or sets the user defined cursor handle. The handle is a windows cursor handle. - - - - - Gets or sets the object of Tiles class associated with map. - - \new490 Added in version 4.9.0 - - - - Gets FileManager object associated with map. The object is used by AxMap.AddLayerFromFilename methods. - - \new491 Added in version 4.9.1 - - - - Gets or sets the background color of the map. - - When using VB.NET the color is represented as a System.Drawing.Color. - When using VB 6 the color can be an OLE_COLOR or an integer representation of an RGB value. - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - .NET clients passing ICallback implementation to this property must make respective - class COM visible by setting ComVisible(true) attribute. In fact ComVisible(true) is set by default - for public classes, so it's enough to make sure that it isn't explicitly set to false for the class - or assembly where the class is defined. Otherwise InvalidCastException may occur at runtime. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - The key may be used by the programmer to store any string data associated with the object. - - - - - Retrieves the last error generated in the object. - - - - - Gets or sets the cursor used with the map. When using crsrUserDefined be sure to set a UDCursorHandle. - - - - - Gets or sets the value which indicates how the control adjust its content after the resizing operations. - - - - - Gets or sets a value which indicates whether the time of map redraw will be displayed on the screen. - - Only times of full redraws when data layers are drawn anew are displayed. - \new48 Added in version 4.8 - - - - Gets or sets a boolean value which indicate whether control's version number will be displayed on the screen. - - \new48 Added in version 4.8 - - - - Gets or sets version number of the control. - - The set part of the property isn't supported. - - - - Gets or sets tile provider for the map. - - This property is a shortcut for AxMap.Tiles.Provider property. - Setting it to ProviderNone will change AxMap.Tiles.Visible property to false. - \new491 Added in version 4.9.1 - - - - Gets list actions performed by user via interactive shape editor. Provides undo/redo capability. - - \new493 Added in version 4.9.3 - - - - Gets an %Identifier object which holds settings of cmIdentify tools. - - \new493 Added in version 4.9.3 - - - - Gets instance of shape editor class associated with map which stores data entered by interactive editing tools. - - \new493 Added in version 4.9.3 - - - - Gets or sets a boolean value which indicate whether map will be redrawn in the course of panning operation. - - The default value is false. Setting this value to true can improve the user experience but - decrease the performance in case large layers are displayed. - \new48 Added in version 4.8 - - - - Gets or sets the cursor mode for the map. - - The cursor mode determines how the map handles mouse click events on the map. The only mode not handled by the map is cmNone. - - - - Gets or sets zoom behaviour for the map control. - - \new491 Added in version 4.9.1 - - - - Checks to see if the map is currently locked or not. - - - - - Gets or sets a boolean value which indicates whether a wait cursor will be displayed on map redraw. - - - - - Gets or sets the speed of zooming with mouse wheel. - - The default values is 0.5. The values in 0.1 - 10.0 range are accepted. The value 1.0 will turn off - the zooming by mouse wheel. - - - - Gets or sets whether the map sends mouse down events. - - - - - Gets or sets whether the map sends mouse move events. - - - - - Gets or sets whether the map sends mouse up events. - - - - - Gets or sets a boolean value which indicates whether the map sends on draw back buffer events. - - - - - Gets or sets whether the map sends the SelectBoxDrag event. - - - - - Gets or sets whether the map sends the SelectBoxFinal event. - - - - - Gets or sets a boolean value which can affect the displaying of the context menus in client code by the right click. - - - - - Gets or sets the factor by which to zoom the view of the map in or out. - - - - - Gets or sets a value indicating whether zoom bar will be displayed on the map. - - Zoom bar can be displayed only if projection of the map is set. Zoom levels - depend upon tile of the current tile provider. - /see AxMap.TileProvider, AxMap.Projection - \new492 Added in version 4.9.2 - - - - Gets or sets a value indicating whether animation will be displayed zooming map in or out. - - Default csAuto value will display animation only if there are no data layers - within visisble extents. Animation also won't be displayed if there are more than 4 - zoom levels between current and target level. - \new492 Added in version 4.9.2 - - - - Gets or sets a value indicating whether animation will be displayed to simulate - inertia after panning operation. - - Default csAuto value will display animation only if there are no data layers - within visisble extents. - \note Mouse panning is somewhat more tricky than the one with smartphone's touch screen, - so some practice may be needed to learn not to stop mouse motion before releasing the button ))) - - \new492 Added in version 4.9.2 - - - - Gets or sets a value indicating whether currently rendered tile buffer should be scaled - and reused during the next redraw. - - \new492 Added in version 4.9.2 - - - - Gets or sets the amount of information to be displayed in zoom bar tool tip. - - \new492 Added in version 4.9.2 - - - - Gets or sets a style of zoom box, which is used to select a region with Zoom In tool. - - \new492 Added in version 4.9.2 + True in case the background is transparent and false otherwise. - + - Gets or sets minimum zoom level to be used by zoom bar. + Sets a boolean value which indicates whether the background of fill stipple for polygon shapefile layer will be transparent. - This property won't increase the number of available levels, - if certain levels aren't supported by the provider they still won't be displayed. - \new492 Added in version 4.9.2 + This property corresponds to the ShapeDrawingOptions.FillBgTransparent property. + The handle of the shapefile layer. + True in case the background is transparent and false otherwise. - + + \addtogroup map_extents Max extents and zoom + Here is list of properties and methods that affect map extents and zoom level. This module is a part of the documentation of AxMap class. + \dot + digraph map_extents { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Map extents adn zoom" URL="\ref map_extents"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ - Gets or sets maximum zoom level to be used by zoom bar. + Sets geographic extents for the map. - This property won't increase the number of available levels, - if certain levels aren't supported by the provider they still won't be displayed. - \new492 Added in version 4.9.2 + Longitude of center of the screen (degrees). + Latitude of center of the screen (degrees). + Width of displayed extents in kilometres. + Projection for the must be specified in order for this method to work. + True on success. + \new491 Added in version 4.9.1 - + - Gets the number of layers loaded in the map. + Gets known extents. + Known extents to retrieve. + Extents object. + \new491 Added in version 4.9.1 @@ -1518,6 +1547,15 @@ Otherwise null will be returned. \new490 Added in version 4.9.0 + + + Sets geographic extents in decimal degrees for the map. + + Geographic extents in decimal degrees. + True on success. + For operation to succeed, projection must be set for the map (see AxMap.GeoProjection property) + \new490 Added in version 4.9.0 + Gets or sets latitude of the center of screen (in decimal degrees). @@ -1573,6 +1611,7 @@ Gets or sets the extents of the map using an Extents object. If the given extents do not fit the aspect ratio of the map, the map will fit the given extents as well as possible. + \new495 Return value changed to IExtents in version 4.9.5 @@ -1580,6 +1619,145 @@ + \addtogroup map_coordinates Map projection and coordinates + Here is list of properties and methods which are related to coordinate system, projection of map and units conversion. + This module is a part of the documentation of AxMap class. + \dot + digraph map_projection { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Max projection and coordianates" URL="\ref map_coordinates"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description\n\n + \anchor a_projection + \section proj1 A. Setting projection for the map. + + No matter what type of GIS application you are going to write, the decision about map coordinate system and projection is one of the first to be made. + MapWinGIS provides the following options. + + \dot + digraph projection_options { + splines = true; + ranksep = 0.15; + nodesep = 0.5; + node [shape = oval, peripheries = 1, fontname=Helvetica, fontsize=9, fillcolor = gray, color = "gray", style = filled, height = 0.3, width = 0.8]; + render [ label="Choosing map projection"]; + + node [shape = "note", width = 0.3, height = 0.3, peripheries = 1 fillcolor = "khaki" ] + s1 [label=" Set projection manullay\l"]; + s2 [label=" Grab projection from data\l"]; + s3 [label=" Don't use projection at all\l"]; + + edge [dir = none, arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#808080" minlen=2 ] + render -> s1; + render -> s2; + render -> s3; + } + \enddot + Let's consider each of the approaches. + + 1. Settings projection manually. \n\n + It can be done using one of the following approaches:\n\n + a) AxMap.Projection property - provides only most common projections (Spherical Mercator, WGS84) but available in Properties Window of Form designer. + \code + axMap1.Projection = tkMapProjection.PROJECTION_WGS84; + \endcode + b) For all other projections - GeoProjection class and AxMap.GeoProjection property: + \code + var gp = new GeoProjection(); + + // one of the following methods can be used; see more in GeoProjection class + // - use projections provided by MapWinGIS enumerations: + gp.SetWgs84Projection(tkWgs84Projection.Wgs84_UTM_zone_22N); + gp.SetWellKnownGeogCS(tkCoordinateSystem.csNAD83); + + // - EPSG code of coordinate system; in this example Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 5; see wwww.spatialreference.org for EPSG codes + gp.ImportFromEPSG(2399); + + // - importing from proj4 or WKT string; in this example proj4 string for Amersfoort / RD New projection for Netherlands + gp.ImportFromAutoDetect("+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs "); + + // applying projection + axMap1.GeoProjection = gp; + \endcode + + 2. Grabbing coordinate system and projection from data. + \code + axMap1.GrabProjectionFromData = true; // default value + axMap1.AddLayerFromFilename(@"d:\some_shapefile.shp", tkFileOpenStrategy.fosVectorLayer, true); + \endcode + GeoProjection will be taken from the first layer added to the map which has metadata about projection. AxMap.GeoProjection property will be updated from this metadata. + When last layer is removed from map AxMap.GeoProjection property will be cleared (set to empty projection). + + 3. Don't specify coordinate system at all.\n + - AxMap.Projection property is equal to PROJECTION_NONE (the default value); + - map units should be set manually via AxMap.MapUnits; + - calculation of distance and area will use Euclidean geometry with no account to the shape of Earth; + - it won't be possible to display tiles from TMS servers. + + To setup map to work without geoprojection use the code: + \code + axMap1.Projection = tkMapProjection.PROJECTION_NONE; + axMap1.GrabProjectionFromData = false; + axMap1.MapUnits = tkUnitsOfMeasure.umMeters; // or another, depending on the data you display + \endcode + + \section proj2 B. Interaction with already set projection + + To check that map actually has a projection: + \code + Debug.WriteLine("Map has projection:" + (axMap1.Projection != tkMapProjection.PROJECTION_NONE)); + // or with mode details + Debug.WriteLine("Projection of the map: " + (axMap1.GeoProjection.IsEmpty() ? "None" : axMap1.GeoProjection.ExportToWKT()); + \endcode + + Another way to check whether map has geoprojection is to see how coordinates are displayed when AxMap.ShowCoordinates is set to cdmAuto. + In case decimal degrees are displayed (Lat/Lng) - map has geoprojection, if x/y pair is shown - no geoprojection was set. + + All of these methods will result in updating AxMap.GeoProjection property. GeoProjection object assigned to map is protected from changes, + i.e. GeoProjection.IsFrozen = true. To change already assigned projection, a new instance of GeoProjection object must be created: + \code + // this one will fail, because projection is frozen + if (!axMap1.GeoProjection.ImportFromEPSG(2399)) + { + Debug.WriteLine("Projection wasn't set: " + axMap1.GeoProjection.get_ErrorMsg(axMap1.GeoProjection.LastErrorCode)); + } + // this one will succeed as a new GeoProjection instance is created by Clone method: + var gp = axMap1.GeoProjection.Clone(); + if (gp.ImportFromEPSG(2399)) + { + axMap1.GeoProjection = gp; + } + \endcode + + Regardless of the method for settings projection MapWinGIS will update AxMap.MapUnits. IF coordinate system is geographic one umDecimalDegrees + will be set, otherwise umMeters. This will ensure that scalebar and measuring will work correctly. + + \section proj3 C. Choosing projection + + When making decision about coordinate system and projection consider:\n\n + 1. Whether it's important to display tiles from online services. Most TMS servers use Shperical Mercator projection (EPSG:3857), + therefore to avoid distortions of tiles map projection should be set to GoogleMercator as well: + \code + axMap1.Projection = tkMapProjection.PROJECTION_GOOGLE_MERCATOR; + \endcode + \note See more details on the issue in description of Tiles class.\n\n + + 2. What data you plan to display and what projection it's using. It's possible to do a reprojection with: + - Utils.ReprojectShapefile for shapefiles; + - Utils.GDALWarp for images and grids. + + But it should be considered whether it is worth the effort. + + Starting from version 4.9.2. built-in projection mismatch testing is implemented + optional + transformation for shapefiles. See GlobalSettings.AllowProjectionMismatch, GlobalSettings.ReprojectLayersOnAdding. + + @{ Gets measuring object associated with map. @@ -1593,6 +1771,15 @@ This method affects the calculation of map scale (see AxMap.CurrentScale). \new48 Added in version 4.8 + + + Converts pixel coordinates to projected map coordinates + + The x pixel coordinate to be converted into the projected x map coordinate. + The y pixel coordinate to be converted into the projected y map coordinate + The projected x map coordinate is returned through this reference parameter. + The projected y map coordinate is returned through this reference parameter. + Gets the number of screen pixels per the decimal degree of the data. @@ -1600,6 +1787,15 @@ The set part of this property isn't supported. The correctness of results depends on AxMap.MapUnits property. \new48 Added in version 4.8 + + + Converts projected map coordinates into screen pixel units + + The projected x map coordinate to be converted into the x pixel coordinate. + The projected y map coordinate to be converted into the y pixel coordinate. + The pixel x coordinate is returned through this reference parameter + The pixel y coordinate is returned through this reference parameter. + Gets or sets a value indicating whether coordinates of the current mouse position will be displayed on map. @@ -1643,7 +1839,98 @@ This property must be set in order for certain functionality to work (tiles, for example). \new490 Added in version 4.9.0 + + + Converts projected map coordinates to decimal degrees (map projection must be specified for this method to work). + + Projected X map coordinate. + Projected Y map coordinate. + Converted longitude in decimal degrees + Converted latitude in decimal degrees + True on success. + \new491 Added in version 4.9.1 + + + + Converts coordinates in decimal degrees to pixel coordinates (map projection must be specified for this method to work). + + X screen coordinate. + Y screen coordinate. + Converted longitude in decimal degrees + Converted latitude in decimal degrees + True on success. + \new491 Added in version 4.9.1 + + + + Converts coordinates in decimal degrees to projected map coordinates (map projection must be specified for this method to work). + + Longitude in decimal degrees. + Latitude in decimal degrees. + Resulting projected X map coordinate. + Resulting Projected Y map coordinate. + True on success. + \new491 Added in version 4.9.1 + + + + Converts pixel coordinates to decimal degrees (map projection must be specified for this method to work). + + Longitude in decimal degrees. + Latitude in decimal degrees. + Converted X screen coordinate. + Converted Y screen coordinate. + True on success. + \new491 Added in version 4.9.1 + + + + Calculates area of polygon taking into account the shape of Earth. + + For the time being only single-part polygons are accepted as input. Calculation are made using + GeographicLib. + Single part polygon shape defined in coordinates of map. + Area of shape in square meters or 0.0 if current map projection doesn't support transformation to WGS84. + \new493 Added in version 4.9.3 + + + + Calculates geodesic distance between 2 points defined in map coordinate system. + + To calculate geodesic distance between 2 points in screen coordinates use AxMap.PixelToProj first. + Calculation are made using GeographicLib. + X coordinate of the first point. + Y coordinate of the first point. + X coordinate of the second point. + Y coordinate of the second point. + Distance between 2 points in meters 0.0 if current map projection doesn't support transformation to WGS84 + \new493 Added in version 4.9.3 + + + + Calculates length of polyline or perimeter of polygon taking into account the shape of Earth. + + For the time being only single-part shapes are accepted as input. Calculation are made using + GeographicLib. + Single part polygon or polyline shape defined in coordinates of map. + Length of polyline or perimeter of polygon in meters or 0.0 if current map projection doesn't support transformation to WGS84. + \new493 Added in version 4.9.3 + + \addtogroup map_events Map events + \dot + digraph map_events_graph { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = gray, width = 0.2, height = 0.2, style = filled] + gr [label="Map events" URL="\ref map_events"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ This event is fired after the rendering of drawing layers. Handle of device context is passed to allow the user to implement custom drawing. @@ -1655,6 +1942,19 @@ Passed by reference. The value should be set to blnTrue in case some additional drawing is performed in client code. + + + This event is fired after the rendering of standard layers. Handle of device context is passed to allow the user to implement custom drawing. + + Handle of device context of screen buffer. + Minimum X coordinate of the rectangle being rendered. + Maximum X coordinate of the rectangle being rendered. + Minimum Y coordinate of the rectangle being rendered. + Maximum Y coordinate of the rectangle being rendered. + Passed by reference. + The value should be set to blnTrue in case some additional drawing is performed in client code. + \new495 Added in version 4.9.5 + This event is fired after interactive editing of shape is finished (AxMap.CursorMode is set to cmEditShape). @@ -1714,6 +2014,19 @@ Passed by reference. The value should be set to blnTrue in case some additional drawing is performed in client code. + + + This event is fired before the rendering of standard layers. Handle of device context is passed to allow the user to implement custom drawing. + + Handle of device context of screen buffer. + Minimum X coordinate of the rectangle being rendered. + Maximum X coordinate of the rectangle being rendered. + Minimum Y coordinate of the rectangle being rendered. + Maximum Y coordinate of the rectangle being rendered. + Passed by reference. + The value should be set to blnTrue in case some additional drawing is performed in client code. + \new495 Added in version 4.9.5 + This event is fired before editing starts for particular shape (after user click on the shape when map cursor is set to cmEditShape). @@ -1947,6 +2260,13 @@ New API members to substitute deprecated ones are listed in description. + + + Gets or sets line separation factor. + + \deprecated v4.8. Use LinePattern class, and ShapeDrawingOptions.LinePattern property instead. + \removed493 Removed in v4.9.3 + Gets one user defined stipple row. @@ -2485,6 +2805,15 @@ \deprecated v4.9.3 Use Utils.IsTiffGrid instead. \removed493 Removed in v4.9.3. + + + Gets or sets the drawing method for vector layers. + + The default value is vdmNewSymbology. From the version 4.8 this is the only value supported. + \new48 Added in version 4.8 + \deprecated v4.8 No longer used. + \removed493 Removed in v4.9.3 + Sets a coloring scheme to be associated with an image layer. @@ -2730,6 +3059,14 @@ \deprecated v4.9.3 Use AxMap.get_LayerLabels, Labels.FontName, Labels.FontSize, Labels.FontBold, Labels.FontItalic, Labels.FontUnderline instead. \removed493 Removed in v4.9.3 + + + Gets or sets a boolean value which indicates whether multiline labels will be drawn correctly on the map. + + \deprecated v 4.8. Multiline labels will be drawn after specification of appropriate label expression. + \see Labels.Expression. + \removed493 Removed in v4.9.3 + Adds label to the specified drawing layer. @@ -2876,6 +3213,13 @@ \deprecated v 4.9.3 Use AxMap.get_DrawingLabels, Labels.FontName, Labels.FontSize instead. \removed493 Removed in v4.9.3 + + + Gets or sets the angle of map rotation in degrees. + + \deprecated v.4.9.3 The functionality is no longer supported. + \removed493 Removed in v4.9.3 + Sets the numeric value which determines the transparency of the given image layer. @@ -2935,46 +3279,6 @@ \deprecated v4.9.3 Use GeoProjection.get_IsSame, GeoProjection.get_IsSameExt instead. \removed493 Removed in v4.9.3 - - - Deprecated. Updates the extents of the layer before the drawing. - - The handle of the layer. - True on success and false in case of invalid layer handle. - \deprecated v.4.8. The call is incorporated into drawing routine. - \removed493 Removed in v4.9.3 - - - - Gets or sets line separation factor. - - \deprecated v4.8. Use LinePattern class, and ShapeDrawingOptions.LinePattern property instead. - \removed493 Removed in v4.9.3 - - - - Gets or sets the drawing method for vector layers. - - The default value is vdmNewSymbology. From the version 4.8 this is the only value supported. - \new48 Added in version 4.8 - \deprecated v4.8 No longer used. - \removed493 Removed in v4.9.3 - - - - Gets or sets a boolean value which indicates whether multiline labels will be drawn correctly on the map. - - \deprecated v 4.8. Multiline labels will be drawn after specification of appropriate label expression. - \see Labels.Expression. - \removed493 Removed in v4.9.3 - - - - Gets or sets the angle of map rotation in degrees. - - \deprecated v.4.9.3 The functionality is no longer supported. - \removed493 Removed in v4.9.3 - Gets or sets a boolean value which indicates how images with identical size and position on the map will be drawn. @@ -3009,5 +3313,24 @@ \deprecated v4.8 This property is no longer used. \removed493 Removed in v4.9.3 + + + Deprecated. Updates the extents of the layer before the drawing. + + The handle of the layer. + True on success and false in case of invalid layer handle. + \deprecated v.4.8. The call is incorporated into drawing routine. + \removed493 Removed in v4.9.3 + + + + Justification of the labels + + + + + Shape drawing method + + diff --git a/docs/AxInterop.MapWinGIS/AxMap.cs b/docs/AxInterop.MapWinGIS/AxMap.cs index 4196ca27..8081488f 100644 --- a/docs/AxInterop.MapWinGIS/AxMap.cs +++ b/docs/AxInterop.MapWinGIS/AxMap.cs @@ -1,5 +1,6 @@ using System; using MapWinGIS; +#pragma warning disable 67 // Never used warning #if nsp namespace AxMapWinGIS @@ -9,7 +10,8 @@ namespace AxMapWinGIS /// Map component for visualization of vector, raster or grid data. /// /// Here is a class diagram for the AxMap class: - /// \dot digraph map_diagram { + /// \dot + /// digraph map_diagram { /// nodesep = 0.3; /// ranksep = 0.3; /// splines = ortho; @@ -316,21 +318,6 @@ public void LoadTilesForSnapshot(Extents extents, int width, string key, tkTileP throw new NotImplementedException(); } - /// - /// Checks whether tiles for specified extents and provider are already present in cache. - /// - /// Extents to check for (map coordinates). - /// Width of the canvas on which the extents will be displayed. - /// Provider to load tiles from. - /// 1 if tiles are in cache, 0 if not, -1 if an there was an error. - /// The main purpose: loading of tiles for printing. - /// \new491 Added in version 4.9.1 - // Removed in v4.9.4 again - //public int TilesAreInCache(Extents extents, int width, tkTileProvider provider) - //{ - // throw new NotImplementedException(); - //} - /// /// Performs specific type of map redraw. /// @@ -713,6 +700,15 @@ public void ZoomToShape(int LayerHandle, int Shape) /// \new492 Added in version 4.9.2 public int ZoomBarMaxZoom { get; set; } + /// + /// Gets or sets a value indicating whether to move the mouse click point to the center of the map + /// when using the Zoom In or Zoom Out tools. + /// + /// The default value is False, indicating that the map is not recentered, + /// but instead keeps the click point at the mouse position and zooms around that point. + /// \new495 Added in version 4.9.5 + public bool RecenterMapOnZoom { get; set; } + /// /// Reverts the last operation performed by user in interactive shape editor. /// @@ -2074,7 +2070,7 @@ public uint get_ShapeLayerStippleColor(int LayerHandle) /// This property corresponds to the ShapeDrawingOptions.FillBgTransparent property. /// This property corresponds to the ShapeDrawingOptions.FillHatchStyle property. /// The handle of the shapefile layer. - /// The color of stipple. + /// The color of stipple. /// \see Shapefile.DefaultDrawingOptions public void set_ShapeLayerStippleColor(int LayerHandle, uint newValue) { diff --git a/docs/AxInterop.MapWinGIS/Enums.cs b/docs/AxInterop.MapWinGIS/Enums.cs index d2c8f49a..4086ea86 100644 --- a/docs/AxInterop.MapWinGIS/Enums.cs +++ b/docs/AxInterop.MapWinGIS/Enums.cs @@ -1,11 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - - - +/// +/// Justification of the labels +/// public enum tkHJustification { } + +/// +/// Shape drawing method +/// public enum tkShapeDrawingMethod { } diff --git a/docs/AxInterop.MapWinGIS/Properties/AssemblyInfo.cs b/docs/AxInterop.MapWinGIS/Properties/AssemblyInfo.cs index 22f966f6..04f7f8b6 100644 --- a/docs/AxInterop.MapWinGIS/Properties/AssemblyInfo.cs +++ b/docs/AxInterop.MapWinGIS/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("AxInterop.MapWinGIS")] -[assembly: AssemblyCopyright("Copyright © 2011")] +[assembly: AssemblyCopyright("Copyright © 2011-2018")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.0.0.*")] [assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/docs/DoxygenLayout.xml b/docs/DoxygenLayout.xml index 9d9f674d..3a230b40 100644 --- a/docs/DoxygenLayout.xml +++ b/docs/DoxygenLayout.xml @@ -1,189 +1,189 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + diff --git a/docs/Interop.MapWinGIS.XML b/docs/Interop.MapWinGIS.XML index 76087c3f..0c2d93aa 100644 --- a/docs/Interop.MapWinGIS.XML +++ b/docs/Interop.MapWinGIS.XML @@ -210,129 +210,6 @@ The index of the field in the attribute table to take values from. The colour of the sector or bar for visualization of a field. - - - Clears the information about individual charts like position and visibility. - - To restore the charts a call of Charts.Generate() is needed. The fields - will remain untouched by this method. - - - - Removes all fields which define bars or sectors of the chart. - - - - - Restores the state of the charts from the serialized string. - - Serialized string generated by Charts.Serialize(). - - - - Draws a chart on the specified device context. Can be used for displaying of map legend. - - The handle of the device context. - The position of the left corner of the drawing in pixels. - The position of the top corner of the drawing in pixels. - When set to true the labels won't be drawn. - The back colour of the device context. - Should be provided to ensure correct alpha blending when transparency is set. - True on success and false otherwise. - - - - Generates a chart for every shape of the parent shapefile. - - This method is time consuming for large shapefiles, therefore consider the serialization of - charts data after first generation. - The position of chart relative to the parent shape. - True on success and false otherwise. - - - - Inserts a field which represents single bar or sector of the chart. - - The index to insert the field at. - The chart field object to insert. - True on success and false otherwise. - - - - Inserts a field which represents single bar or sector of the chart. - - The index to insert the field at. - The index of the field from the attribute table (.dbf) to take values from. - The colour of the fill. - True on success and false otherwise. - - - - Loads charts data from the XML file generated by Charts.SaveToXML. - - The filename to load data from. - True on successful loading and false otherwise. - - - - Changes the position of a field (bar or sector) in the list which affects the order of drawing. - - The old index of the field. - The new index of the field. - - - - - Removes the field which corresponds to the bar or the sector of the chart. - - The index of the field to remove. - True on success and false otherwise. - - - - Saves the state of the charts to the XML file. - - Charts.SavingMode defines the particular data which will be serialized. - The filename to save into. - True on success and false otherwise. - - - - Returns the indices of charts which are displayed within specified rectangle on the screen. - - The rectangle to select charts within (in screen coordinates). - The tolerance in pixels. The bounding box will be expanded by this values. - The selection mode. - The array of integer type with indices of the selected charts. - True if at least one chart was selected and false otherwise. - - - - Serializes the state of the charts to the string. - - The serialized string. - - - - Gets a reference to the chart with the specified index. - - The index of the chart to extract. - The reference to the chart of NULL reference on failure. - - - - Gets the description of the specified error code. - - The error code returned by Charts.LastErrorCode. - The description of error. - - - - Gets a reference to the field of the chart with the specified index. - - The index of the field. - The reference to the chart field or NULL reference on failure. - Gets or set a boolean value which indicates whether charts can overlap each other. @@ -366,6 +243,18 @@ Bar and pie charts are available. All charts of the shapefile are of the same type. + + + Clears the information about individual charts like position and visibility. + + To restore the charts a call of Charts.Generate() is needed. The fields + will remain untouched by this method. + + + + Removes all fields which define bars or sectors of the chart. + + Gets or sets the minimal distance between individual charts when Charts.AvoidCollisions is set to true. @@ -379,12 +268,39 @@ Returns the number of charts which is equal to the number of shapes in the parent shapefile. + + + Restores the state of the charts from the serialized string. + + Serialized string generated by Charts.Serialize(). + + + + Draws a chart on the specified device context. Can be used for displaying of map legend. + + The handle of the device context. + The position of the left corner of the drawing in pixels. + The position of the top corner of the drawing in pixels. + When set to true the labels won't be drawn. + The back colour of the device context. + Should be provided to ensure correct alpha blending when transparency is set. + True on success and false otherwise. + Gets or sets a value which indicates whether charts will be visible for all scales or in the given range of scales only. \see Charts.MaxVisibleScale, Charts.MinVisibleScale + + + Generates a chart for every shape of the parent shapefile. + + This method is time consuming for large shapefiles, therefore consider the serialization of + charts data after first generation. + The position of chart relative to the parent shape. + True on success and false otherwise. + Gets or sets a callback object to display progress and error information. @@ -403,6 +319,23 @@ The property can be used for interactive selection of charts and for drawing of legend. + + + Inserts a field which represents single bar or sector of the chart. + + The index to insert the field at. + The chart field object to insert. + True on success and false otherwise. + + + + Inserts a field which represents single bar or sector of the chart. + + The index to insert the field at. + The index of the field from the attribute table (.dbf) to take values from. + The colour of the fill. + True on success and false otherwise. + Gets or sets a string value associated with the object. @@ -419,6 +352,13 @@ Gets or sets the color of the chart outline + + + Loads charts data from the XML file generated by Charts.SaveToXML. + + The filename to load data from. + True on successful loading and false otherwise. + Get or sets the maximum scale the charts are displayed when dynamic visibility is turned on. @@ -429,6 +369,14 @@ Gets or sets the minimal scale the charts are displayed when dynamic visibility is turned on. + + + Changes the position of a field (bar or sector) in the list which affects the order of drawing. + + The old index of the field. + The new index of the field. + + Gets or sets the index of field upon which the values of other fields will be divided before displaying charts. @@ -472,11 +420,42 @@ This property is no implemented. + + + Removes the field which corresponds to the bar or the sector of the chart. + + The index of the field to remove. + True on success and false otherwise. + + + + Saves the state of the charts to the XML file. + + Charts.SavingMode defines the particular data which will be serialized. + The filename to save into. + True on success and false otherwise. + Gets or sets the mode for serialization of charts. Affects Charts.SaveToXML method. + + + Returns the indices of charts which are displayed within specified rectangle on the screen. + + The rectangle to select charts within (in screen coordinates). + The tolerance in pixels. The bounding box will be expanded by this values. + The selection mode. + The array of integer type with indices of the selected charts. + True if at least one chart was selected and false otherwise. + + + + Serializes the state of the charts to the string. + + The serialized string. + Gets or sets the index of field which affect the radius of charts when Charts.UseVariableRadius is set to true. @@ -573,6 +552,27 @@ Turns on or off the visibility of charts. + + + Gets a reference to the chart with the specified index. + + The index of the chart to extract. + The reference to the chart of NULL reference on failure. + + + + Gets the description of the specified error code. + + The error code returned by Charts.LastErrorCode. + The description of error. + + + + Gets a reference to the field of the chart with the specified index. + + The index of the field. + The reference to the chart field or NULL reference on failure. + @@ -592,16 +592,37 @@ \new494 Added in version 4.9.4 - + - Removes colour break with specified index. + Gets or set the callback object to report errors. - The index of colour break to remove. - True on successful removal and false otherwise. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Clears all the existing breaks and creates 2 breaks with the specified colours. + Gets or sets the string value associated with the instance of the class. + + + + + Gets the code of the last error which occurred within this instance of class. + + + + + Returns the number of breaks within colour scheme. + + + + + Removes colour break with specified index. + + The index of colour break to remove. + True on successful removal and false otherwise. + + + + Clears all the existing breaks and creates 2 breaks with the specified colours. The values of the breaks will be 0.0 for the first one and 1.0 for the second. The colour of the first break. @@ -681,27 +702,6 @@ The index of the break. The new colour to set. - - - Gets or set the callback object to report errors. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Gets or sets the string value associated with the instance of the class. - - - - - Gets the code of the last error which occurred within this instance of class. - - - - - Returns the number of breaks within colour scheme. - - Represents a layer downloading and displaying the data from the particular WMS Server. @@ -726,6 +726,11 @@ String with the previous state of the layer. True on success. + + + Gets the code of the last error which occurred inside this instance. + + Gets error message for the specific error code. @@ -733,11 +738,6 @@ The error code. The error message. - - - Gets the code of the last error which occurred inside this instance. - - Gets or sets a key associated with this instance (any data can be stored in it by applications). @@ -897,6 +897,11 @@ The column. The row. + + + Gets the count. + + Gets the layer handle for the item with specified pixel. @@ -949,11 +954,6 @@ Column index or -1 if the specified item is a shape. \new495 Added in version 4.9.5 - - - Gets the count. - - Represents a single band of raster datasource. @@ -1033,29 +1033,6 @@ The count. True on success. - - - Gets the specified metadata item. - - Index of the item. - String with metadata. - - - - Gets specified overview of the raster band. - - Index of the overview. - The overview as another instance of GdalRasterBand. - - - - Gets the value of the specified pixel. - - The column. - The row. - The value. - True on success. - Gets no data value. @@ -1131,17 +1108,45 @@ Gets the number of metadata items associated with the band. + + + Gets the specified metadata item. + + Index of the item. + String with metadata. + Gets the color table associated with the band. + + + Gets specified overview of the raster band. + + Index of the overview. + The overview as another instance of GdalRasterBand. + + + + Gets the value of the specified pixel. + + The column. + The row. + The value. + True on success. + Holds all available GDAL drivers. \new494 Added in version 4.9.4 + + + Gets the number of drivers. + + Gets the specified driver. @@ -1156,11 +1161,6 @@ Name of the driver. The driver. - - - Gets the number of drivers. - - Represents a single GDAL driver. @@ -1175,6 +1175,11 @@ The metadata. String with metadata. + + + Gets the the number of metadata items associated with the driver. + + Gets specified metadata item. @@ -1182,6 +1187,21 @@ Index of the metadata item. String with metadata. + + + Gets the name of the driver. + + + + + Gets a value indicating whether the driver works vector data. + + + + + Gets a value indicating whether the driver works raster data. + + Gets the type of the specified metadata item. @@ -1203,26 +1223,6 @@ Index of the metadata item. Metadata item key. - - - Gets the the number of metadata items associated with the driver. - - - - - Gets the name of the driver. - - - - - Gets a value indicating whether the driver works vector data. - - - - - Gets a value indicating whether the driver works raster data. - - Represents a light wrapper around GDAL raster dataset which allows to perform some @@ -1274,30 +1274,16 @@ \new494 Added in version 4.9.4 - - - Gets the alias of the function. - - Index of the alias. - - - - Gets the name of the specified parameter. - - Index of the parameter. - The name of the parameter. - - + - Gets the description of the specified parameter of the function. + Gets the name of the function. - Index of the parameter. - The description of the parameter. - + - Gets the name of the function. + Gets the alias of the function. + Index of the alias. @@ -1319,6 +1305,20 @@ Gets the description of the function. + + + Gets the name of the specified parameter. + + Index of the parameter. + The name of the parameter. + + + + Gets the description of the specified parameter of the function. + + Index of the parameter. + The description of the parameter. + Gets the signature of the function. @@ -1368,13 +1368,6 @@ The result of calculation (string, double, or boolean). True on success. - - - Gets the specified function from the list of function recognized by the expression parser. - - Index of the function. - The function object with metadata. - Gets the last error message. @@ -1390,6 +1383,13 @@ Gets the number of functions recognized by the expression parser. + + + Gets the specified function from the list of function recognized by the expression parser. + + Index of the function. + The function object with metadata. + Gets the table associated with the current expression. @@ -1469,6 +1469,12 @@ The filename of the ESRI grid to be deleted. A boolean value representing the success or failure of deleting the specified ESRI grid. + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + Gets whether or not the specified file is an ESRI grid. @@ -1476,6 +1482,11 @@ The filename of the grid to be checked. A boolean value representing whether or not the specified file is an ESRI grid. + + + Retrieves the last error generated in the object. + + Retrieves the error message associated with the specified error code. @@ -1483,17 +1494,6 @@ The error code for which the error message is required. The error message description for the specified error code. - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Retrieves the last error generated in the object. - - Represents a rectangle on the map. @@ -1566,50 +1566,19 @@ The new minimum measure bound for the extents object. The new maximum measure bound for the extents object. - + - Gets serialized contents of the extents for debug purposes. + The maximum measure bound in the exents object. Measure bounds only apply to shapefiles containing measure data. - Serialized string. - \new491 Added in version 4.9.1 - + - Moves extents so that center point will be at specified coordinates, while width and height will be preserved. + Gets the minimum measure bound for the extents object. Measure bounds only apply to shapefiles containing measure data. - X coordinate of new center. - Y coordinate of new center. - \new491 Added in version 4.9.1 - + - Checks whether a point is within extents - - X coordinate of point - Y coordinate of point - True if point is within extents - \new491 Added in version 4.9.1 - - - - Creates a rectangular polygon matching current extents. - - New polygon shape. - \new491 Added in version 4.9.1 - - - - The maximum measure bound in the exents object. Measure bounds only apply to shapefiles containing measure data. - - - - - Gets the minimum measure bound for the extents object. Measure bounds only apply to shapefiles containing measure data. - - - - - The maximum x bound for the extents object. + The maximum x bound for the extents object. @@ -1637,12 +1606,58 @@ Gets the minimum z bound for the extents object. + + + Gets serialized contents of the extents for debug purposes. + + Serialized string. + \new491 Added in version 4.9.1 + Gets a center point for the extents. \new491 Added in version 4.9.1 + + + Moves extents so that center point will be at specified coordinates, while width and height will be preserved. + + X coordinate of new center. + Y coordinate of new center. + \new491 Added in version 4.9.1 + + + + Checks whether a point is within extents + + X coordinate of point + Y coordinate of point + True if point is within extents + \new491 Added in version 4.9.1 + + + + Creates a rectangular polygon matching current extents. + + New polygon shape. + \new491 Added in version 4.9.1 + + + + Gets the Width of the extents object (xMax - xMin). + + + + + Gets the Height of the extents object (yMax - yMin). + + + + + Gets the Depth of the extents object (zMax - zMin). + + Provides settings for built-in identifier tool (cmIdentify cursor). @@ -1701,6 +1716,23 @@ String generated with OgrLayer.Serialize method. True on success. + + + Gets GeoProjection associated with current layer. + + + Corresponds to SRID set for the layer in underlying datasource. + When SRID isn't specified (i.e. equals 0), empty GeoProjection instance will be returned. + + + + Gets the name of geometry column which was used to fetch geometry for current layer. + + Depending on data format, a layer may support several geometry columns but + only one will be used to provide shape data via OgrLayer.GetBuffer(). By default + the first column with geometry/geography type will be used. To access other columns + temporary layers can be opened via OgrDatasource.RunQuery. + Gets layer data represented as in-memory shapefile. @@ -1722,6 +1754,29 @@ The error code returned by LastErrorCode property. String with the description. + + + Gets code of the last error which took place inside this object. + + + + + Gets or sets a Callback object which handles progress and error messages. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + A text string associated with object. Any value can be stored by developer in this property. + + + + + Gets name of the layer. + + The name may correspond to table name in underlying database or store some generic string like + "sql_statement" for temporary layers opened by OgrDatasource.RunQuery. + Opens layer with specified name from the OGR datasource. @@ -1780,6 +1835,34 @@ String with state information. + + + Gets shape type of the current layer. + + The property automatically maps underlying OGRwkbGeometryType to corresponding shape type. + + + + Gets "flattened" type of the current layer, i.e. Z and M components will be ignored. + + + + + Gets name of the driver which is used to access layer datasource. + + + + + Gets the array of available shape types inside OGR layer (should be cast to ShpfileType[]). + + \new494 Added in version 4.9.4 + + + + Gets or sets the type of the active shape type for the layer (is used in OgrLayer.GetBuffer for example). + + \new494 Added in version 4.9.4 + Gets layer name or SQL query which was used to open this layer. @@ -1836,12 +1919,42 @@ if information can't be retrieved from underlying datasource otherwise. Number of features in the layer. + + + Gets source type of the layer. + + Any new instance of class starts with ogrUninitialized. Successful call of OgrLayer.OpenFromDatabase + method will set it to ogrDbTable, OgrLayer.OpenFromQuery - to ogrQuery. + Source type. + + + + Extracts the last error message reported by GDAL library. + + Clears all the styles stored for current layer in datasource. True on success. + + + Gets or sets a value indicating whether features for large layers are to be loaded dynamically + when moving to the new portions of map. + + When set to false only the number of features set by OgrLayer.MaxFeatureCount + is loaded into memory. No further attempts to load additional features will be done.\n + + In dynamic loading mode after map extents change a check is made + whether features for the requested extents are already in memory. If not the data loading + is started in the background thread. When the loading is over all the features currently stored + in memory will be discarded. If the amount of features in new map extents exceeds + OgrLayer.MaxFeatureCount no background loading will be done. \n + + The mode is chosen automatically when the layer is opened depending on the number of features. + But afterwards it's possible possible to change the value. + Generates visualization categories for OGR layer. @@ -1926,6 +2039,39 @@ \endcode Number of styles. + + + Gets or sets an expression for label generation for the layer. + + The syntax of expression is the same as for Shapefile.Labels.Generate method. To + generate labels based on single field use "[FieldName]" syntax. The property is supported + for dynamic loading mode, where labels will be generated on the fly after each zooming + operation. + + + + + Gets or sets label orientation for polyline layers. + + \see OgrLayer.LabelExpression + + + + Gets or sets position of labels relative to their parent features. + + \see OgrLayer.LabelExpression + + + + Gets or sets maximum number of features to be loaded in the memory. + + If total number of features exceeds this number the layer will be rendered + in dynamic loading mode (see OgrLayer.DynamicLoading). During dynamic loading if + number of features for the new map extents exceeds this number they won't be loaded. The default + value of property can be changed with GlobalSettings.OgrLayerMaxFeatureCount. + + \see OgrLayer.GetBuffer + Removes style with particular name from the datasource. @@ -1933,6 +2079,13 @@ The name of the style. True on success. + + + Checks whether the layers supports saving of styles to the datasource. + + This property will check the presence of mw_styles table in the datasource and then + will try to create one if it's missing. If neither succeeds, false will be returned. + Gets name of the style with particular index. @@ -1940,23 +2093,7 @@ Index of style. Name of the style. - - - Gets a value indicating whether the layer supports editing. - - - The property works like this:\n - 1) checks whether underlying driver supports random write operation: - OgrLayer.TestCapability(tkOgrLayerCapability::olcRandomWrite);\n - 2) the presence of Feature Id column is verified;\n - 3) checks if the data is still in the same projection (OgrLayer.DataIsReprojected).\n - - OgrLayer.SaveChanges method doesn't make the first check, thus trying to write - the data even if functionality isn't advertised by driver. - - The requested type of editing. - True in case editing is supported. - + Gets a specified error message from the log registered during OgrLayer.SaveChanges call. @@ -1972,6 +2109,32 @@ Error index. Index of shape in underlying in-memory shapefile (OgrLayer.GetBuffer()). + + + Gets the number of errors registered in the log during OgrLayer.SaveChanges call. + + + + + Gets name of feature ID column. + + Feature ID column corresponds to primary key in underlying database table. + It is used to uniquely identify features and to save changes back to datasource. + Feature ID column (if present) will always be inserted as a first field of attribute + table of underlying shapefile. This field must not be edited.\n + + For inserted features the column values are set to NULL. \n + + In case underlying datasource doesn't have feature ID column, an empty string will be returned. + + + + Gets a value indicating whether underlying data ( OgrLayer.GetBuffer ) was reprojected. + + + This may happen because of projection mismatch on adding it to the map. See GlobalSettings.ReprojectLayersOnAdding for details. + + Saves local changes to the datasource. @@ -1998,173 +2161,9 @@ i.e. invalid shapes won't be saved. Result of the operation. - + - Gets GeoProjection associated with current layer. - - - Corresponds to SRID set for the layer in underlying datasource. - When SRID isn't specified (i.e. equals 0), empty GeoProjection instance will be returned. - - - - Gets the name of geometry column which was used to fetch geometry for current layer. - - Depending on data format, a layer may support several geometry columns but - only one will be used to provide shape data via OgrLayer.GetBuffer(). By default - the first column with geometry/geography type will be used. To access other columns - temporary layers can be opened via OgrDatasource.RunQuery. - - - - Gets code of the last error which took place inside this object. - - - - - Gets or sets a Callback object which handles progress and error messages. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - A text string associated with object. Any value can be stored by developer in this property. - - - - - Gets name of the layer. - - The name may correspond to table name in underlying database or store some generic string like - "sql_statement" for temporary layers opened by OgrDatasource.RunQuery. - - - - Gets shape type of the current layer. - - The property automatically maps underlying OGRwkbGeometryType to corresponding shape type. - - - - Gets "flattened" type of the current layer, i.e. Z and M components will be ignored. - - - - - Gets name of the driver which is used to access layer datasource. - - - - - Gets the array of available shape types inside OGR layer (should be cast to ShpfileType[]). - - \new494 Added in version 4.9.4 - - - - Gets or sets the type of the active shape type for the layer (is used in OgrLayer.GetBuffer for example). - - \new494 Added in version 4.9.4 - - - - Gets source type of the layer. - - Any new instance of class starts with ogrUninitialized. Successful call of OgrLayer.OpenFromDatabase - method will set it to ogrDbTable, OgrLayer.OpenFromQuery - to ogrQuery. - Source type. - - - - Extracts the last error message reported by GDAL library. - - - - - Gets or sets a value indicating whether features for large layers are to be loaded dynamically - when moving to the new portions of map. - - When set to false only the number of features set by OgrLayer.MaxFeatureCount - is loaded into memory. No further attempts to load additional features will be done.\n - - In dynamic loading mode after map extents change a check is made - whether features for the requested extents are already in memory. If not the data loading - is started in the background thread. When the loading is over all the features currently stored - in memory will be discarded. If the amount of features in new map extents exceeds - OgrLayer.MaxFeatureCount no background loading will be done. \n - - The mode is chosen automatically when the layer is opened depending on the number of features. - But afterwards it's possible possible to change the value. - - - - Gets or sets an expression for label generation for the layer. - - The syntax of expression is the same as for Shapefile.Labels.Generate method. To - generate labels based on single field use "[FieldName]" syntax. The property is supported - for dynamic loading mode, where labels will be generated on the fly after each zooming - operation. - - - - - Gets or sets label orientation for polyline layers. - - \see OgrLayer.LabelExpression - - - - Gets or sets position of labels relative to their parent features. - - \see OgrLayer.LabelExpression - - - - Gets or sets maximum number of features to be loaded in the memory. - - If total number of features exceeds this number the layer will be rendered - in dynamic loading mode (see OgrLayer.DynamicLoading). During dynamic loading if - number of features for the new map extents exceeds this number they won't be loaded. The default - value of property can be changed with GlobalSettings.OgrLayerMaxFeatureCount. - - \see OgrLayer.GetBuffer - - - - Checks whether the layers supports saving of styles to the datasource. - - This property will check the presence of mw_styles table in the datasource and then - will try to create one if it's missing. If neither succeeds, false will be returned. - - - - Gets the number of errors registered in the log during OgrLayer.SaveChanges call. - - - - - Gets name of feature ID column. - - Feature ID column corresponds to primary key in underlying database table. - It is used to uniquely identify features and to save changes back to datasource. - Feature ID column (if present) will always be inserted as a first field of attribute - table of underlying shapefile. This field must not be edited.\n - - For inserted features the column values are set to NULL. \n - - In case underlying datasource doesn't have feature ID column, an empty string will be returned. - - - - Gets a value indicating whether underlying data ( OgrLayer.GetBuffer ) was reprojected. - - - This may happen because of projection mismatch on adding it to the map. See GlobalSettings.ReprojectLayersOnAdding for details. - - - - - Facilitates interactive creation and editing of vector shapes. + Facilitates interactive creation and editing of vector shapes. @@ -2274,6 +2273,24 @@ \new493 Added in version 4.9.3 + + + Calculates the area of polygon being edited. + + Precise calculations on ellipsoid will be used if map projection is set and compatible + with WGS84. Otherwise simply Euclidean geometry will be used. + + + + Gets or sets type of the bearing to be display for line segments. + + \new493 Added in version 4.9.3 + + + + Gets or sets area display mode for polygon shapes. The default value is admNone. + + Clears the editor returning it to an empty state. @@ -2289,193 +2306,68 @@ Instance of visualization options. \see Shapefile.DefaultDrawingOptions - + - Saves any changes made by user. + Gets or sets editor behavior during the editing of existing shape, either vertex editor or part editor. - The editor will try to validate underlying shape on this call. If validation succeeds - the changes will be passed to the original shapefile or other actions defined by - current interactive tool will be triggered. - Depending on editor state the actions will be: - - esDigitize: new shape will be added to the shapefile set by ShapeEditor.LayerHandle property; - - esEdit: shapefile will be updated with modified version of shape; - - esDigitizeUnbound: a tool which started the unbound mode execute the appropriate action - (clipping, selection by polygon, etc.); - - esOverlay: current overlay operation (i.e. eoAddPart or eoRemovePart) will be discarded, editor - will return in esEdit state after which an attempt will be made to validate and save shape in regular manner. - - True on success. - \see AxMap.CursorMode, ShapeEditor.EditorState - + - Saves the state of the class to the string + Gets the state an editor is currently in. See tkEditorState enumeration for details. - A string with the state or an empty string on failure. - + - Restores the state of object from the string. + Gets or sets fill color for the shape being edited. Applies for polygon shapes only. - A string generated by ShapeEditor.Serialize() method - True on success. - + - Starts editing of a given shape in specified shapefile. + Gets or sets fill transparency for the shape being edited. Applies for polygon shapes only. - Layer handle of the shapefile. - Index of shape to edit. - True on success. - The method will populate the editor with vertices of specified shape, - hide original shape with Shapefile.put_ShapeIsHidden and set ShapeEditor.EditorState to esEdit. - + - Starts overlay operation for the current shape. + Gets or sets a Callback object which handles progress and error messages. - Editor must be in esEdit state already, i.e. ShapeEditor.StartEdit must be called first. - Type of overlay operation. - True on success. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Initializes editor for creation of unbound shape. + Returns true if editor has changes caused by user input. - Unbound shape is the one which is not linked to particular shapefile. This - method is used internally by a number of built-in tools, - like cmSelectByPolygon or cmSplitByPolyline. - Type of shape to be created. - True on success. - + - Allows to undo the last vertex entered by user. + Gets a value indicating whether calculations are performed taking into account the shape of Earth + (when map projection is defined), or on 2D plane (Euclidean geometry). - The method works when new shape is being created, i.e. ShapeEditor.IsDigitizing return true. - True on success, false if the editor is empty and there is no points to undo. - + - Gets the description of the specific error code. + Gets the length of measured path (in meters if WGS84 compatible projection is set for map and in current map units otherwise). - The error code returned by LastErrorCode property. - String with the description. - + - Gets coordinates of specified point of edited shape. + Gets or sets a value indicating whether area will be displayed during creation or editing of polygons. - Index of point. - X in projected map coordinates. - Y in projected map coordinates. - True if index of point within bounds. - + - Sets coordinates of specified point of edited shape. + Gets or sets the number of decimal degrees to be used to display area. - Index of point. - X in projected map coordinates. - Y in projected map coordinates. - True if index of point within bounds. + \new493 Added in version 4.9.3 - + - Returns directional angle (bearing) of a given segment of edited shape. + Gets or sets the number of decimal degrees to be used to display length. - Segment index to calculate angle for. - Angle in degrees. + \new493 Added in version 4.9.3 - + - Gets length of a given segment of edited shape. - - Segment index to calculate length for. - Length of segment in meters. - If map projection is set and compatible with WGS84 geodesic distance will be returned. - Otherwise Euclidean geometry will be used. - - - - Calculates the area of polygon being edited. - - Precise calculations on ellipsoid will be used if map projection is set and compatible - with WGS84. Otherwise simply Euclidean geometry will be used. - - - - Gets or sets type of the bearing to be display for line segments. - - \new493 Added in version 4.9.3 - - - - Gets or sets area display mode for polygon shapes. The default value is admNone. - - - - - Gets or sets editor behavior during the editing of existing shape, either vertex editor or part editor. - - - - - Gets the state an editor is currently in. See tkEditorState enumeration for details. - - - - - Gets or sets fill color for the shape being edited. Applies for polygon shapes only. - - - - - Gets or sets fill transparency for the shape being edited. Applies for polygon shapes only. - - - - - Gets or sets a Callback object which handles progress and error messages. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Returns true if editor has changes caused by user input. - - - - - Gets a value indicating whether calculations are performed taking into account the shape of Earth - (when map projection is defined), or on 2D plane (Euclidean geometry). - - - - - Gets the length of measured path (in meters if WGS84 compatible projection is set for map and in current map units otherwise). - - - - - Gets or sets a value indicating whether area will be displayed during creation or editing of polygons. - - - - - Gets or sets the number of decimal degrees to be used to display area. - - \new493 Added in version 4.9.3 - - - - Gets or sets the number of decimal degrees to be used to display length. - - \new493 Added in version 4.9.3 - - - - Gets or sets angle format to be used to display bearing. + Gets or sets angle format to be used to display bearing. \new493 Added in version 4.9.3 @@ -2561,6 +2453,37 @@ Gets underlying shape data without any attempt to validate it. + + + Saves any changes made by user. + + The editor will try to validate underlying shape on this call. If validation succeeds + the changes will be passed to the original shapefile or other actions defined by + current interactive tool will be triggered. + Depending on editor state the actions will be: + - esDigitize: new shape will be added to the shapefile set by ShapeEditor.LayerHandle property; + - esEdit: shapefile will be updated with modified version of shape; + - esDigitizeUnbound: a tool which started the unbound mode execute the appropriate action + (clipping, selection by polygon, etc.); + - esOverlay: current overlay operation (i.e. eoAddPart or eoRemovePart) will be discarded, editor + will return in esEdit state after which an attempt will be made to validate and save shape in regular manner. + + True on success. + \see AxMap.CursorMode, ShapeEditor.EditorState + + + + Saves the state of the class to the string + + A string with the state or an empty string on failure. + + + + Restores the state of object from the string. + + A string generated by ShapeEditor.Serialize() method + True on success. + Gets or sets the index of currently selected vertex. @@ -2589,6 +2512,41 @@ Gets or sets snapping tolerance in screen coordinates. + + + Starts editing of a given shape in specified shapefile. + + Layer handle of the shapefile. + Index of shape to edit. + True on success. + The method will populate the editor with vertices of specified shape, + hide original shape with Shapefile.put_ShapeIsHidden and set ShapeEditor.EditorState to esEdit. + + + + Starts overlay operation for the current shape. + + Editor must be in esEdit state already, i.e. ShapeEditor.StartEdit must be called first. + Type of overlay operation. + True on success. + + + + Initializes editor for creation of unbound shape. + + Unbound shape is the one which is not linked to particular shapefile. This + method is used internally by a number of built-in tools, + like cmSelectByPolygon or cmSplitByPolyline. + Type of shape to be created. + True on success. + + + + Allows to undo the last vertex entered by user. + + The method works when new shape is being created, i.e. ShapeEditor.IsDigitizing return true. + True on success, false if the editor is empty and there is no points to undo. + Validates the data stored by editor and returns it as a shape. @@ -2605,6 +2563,47 @@ Gets or sets value indicating whether vertices edited shapes are visible. + + + Gets the description of the specific error code. + + The error code returned by LastErrorCode property. + String with the description. + + + + Gets coordinates of specified point of edited shape. + + Index of point. + X in projected map coordinates. + Y in projected map coordinates. + True if index of point within bounds. + + + + Sets coordinates of specified point of edited shape. + + Index of point. + X in projected map coordinates. + Y in projected map coordinates. + True if index of point within bounds. + + + + Returns directional angle (bearing) of a given segment of edited shape. + + Segment index to calculate angle for. + Angle in degrees. + + + + Gets length of a given segment of edited shape. + + Segment index to calculate length for. + Length of segment in meters. + If map projection is set and compatible with WGS84 geodesic distance will be returned. + Otherwise Euclidean geometry will be used. + Gets number of points the shape being edited has. @@ -2702,6 +2701,21 @@ Clears all previously added operations + + + Gets the number of added operations. + + + + + A text string associated with object. Any value can be stored by developer in this property. + + + + + Gets the code of last error which took place inside this object. + + Removes operations with specified index. @@ -2764,22 +2778,38 @@ Index of operation to check the property for. Reason for invalidity or fovValid in operation is applicable. - + + - Gets the number of added operations. + Gets or sets a Callback object which handles progress and error messages. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + A text string associated with object. Any value can be stored by developer in this property. - + Gets the code of last error which took place inside this object. - + + + Gets filename of the last datasource that was attempted to be opened. + + + + + Gets a value indicating whether the last attempt to open a datasource was successful. + + + + + Gets a strategy that was used on last attempt to open datasource. + + Tries to open datasource with specified name. @@ -2923,79 +2953,48 @@ Filename of grid datasource. True if proxy images exist. - + - Tries to open specified file as OGR datasource. + Gets expression to be set for OpenFileDialog.Filter property to select supported datasources. - Filename of the datasource to be opened. - Instance of OgrDatasource or null on failure. \new493 Added in version 4.9.3 - + - Tries to open specified file as OGR layer. + Gets expression to be set for OpenFileDialog.Filter property to select raster datasources (both RGB images and grids). - When preferedShapeType is set to default ShpfileType.SHP_NULLSHAPE value or there is no layer - with preferedShapeType, then the first layer in datasource will be returned. - Filename of the datasource to be opened. - Sets type of layer to be returned from datasource in case there are multiple layers available. - True in case layer should be open in read/write mode. - Instance of OgrLayer or null on failure. \new493 Added in version 4.9.3 - + - Gets or sets a Callback object which handles progress and error messages. + Gets expression to be set for OpenFileDialog.Filter property to select vector datasources. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + \new493 Added in version 4.9.3 - - - A text string associated with object. Any value can be stored by developer in this property. - - - - - Gets the code of last error which took place inside this object. - - - - - Gets filename of the last datasource that was attempted to be opened. - - - - - Gets a value indicating whether the last attempt to open a datasource was successful. - - - - - Gets a strategy that was used on last attempt to open datasource. - - - - - Gets expression to be set for OpenFileDialog.Filter property to select supported datasources. - - \new493 Added in version 4.9.3 - - + - Gets expression to be set for OpenFileDialog.Filter property to select raster datasources (both RGB images and grids). + Gets string with the list of supported GDAL formats. \new493 Added in version 4.9.3 - + - Gets expression to be set for OpenFileDialog.Filter property to select vector datasources. + Tries to open specified file as OGR datasource. + Filename of the datasource to be opened. + Instance of OgrDatasource or null on failure. \new493 Added in version 4.9.3 - + - Gets string with the list of supported GDAL formats. + Tries to open specified file as OGR layer. + When preferedShapeType is set to default ShpfileType.SHP_NULLSHAPE value or there is no layer + with preferedShapeType, then the first layer in datasource will be returned. + Filename of the datasource to be opened. + Sets type of layer to be returned from datasource in case there are multiple layers available. + True in case layer should be open in read/write mode. + Instance of OgrLayer or null on failure. \new493 Added in version 4.9.3 @@ -3039,13 +3038,6 @@ The copy of the field. \new48 Added in version 4.8 - - - Retrieves the error message associated with the specified error code. - - The error code for which the error message is required. - The error message description for the specified error code. - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. @@ -3116,6 +3108,13 @@ Gets or sets the width of the field. + + + Retrieves the error message associated with the specified error code. + + The error code for which the error message is required. + The error message description for the specified error code. + Holds information about coordinate system and projection of the data. @@ -3218,6 +3217,18 @@ The string with WKT projection. + + + Returns the name of the coordinate system. + + An empty string will be returned unless GeoProjection.IsGeographic property returns true. + + + + Gets or sets a callback object which is used to report errors. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + Initializes geoprojection from the input string of arbitrary format. @@ -3254,6 +3265,55 @@ The string in the OGC WKT format. True on success and false otherwise. + + + Returns the inverse flattening of the reference ellipsoid of the coordinate system. + + + + + Gets a boolean value which indicates whether any projection definition is stored in the object. + + + + + Gets a boolean value which indicates whether the coordinate system stored in the object is the geographic one. + + + + + Gets a boolean value which indicates whether the coordinate system stored in the object is the local one. + + + + + Gets a boolean value which indicates whether the coordinate system stored in the object is the projected one. + + + + + A text string associated with the instance of the class. Any value can be stored by developer in this property. + + + + + Retrieves the numeric code of the last error that took place in the class. + + The usage of this property clears the error code. + + + + Returns the name of the coordinate system. + + Either GeoProjection.GeogCSName or GeoProjection.ProjectionName will be returned + depending on the type of coordinate system. + + + + The name of the projected coordinate system. + + An empty string will be returned unless GeoProjection.IsProjected property returns true. + Initializes geoprojection from the specified file. @@ -3263,6 +3323,16 @@ The name of the file to read projection string from. True on success and false otherwise. + + + Returns the half of the major axis of the reference ellipsoid. + + + + + Returns the half of the minor axis of the reference ellipsoid. + + Initializes the object with NAD83 projection specified by enumerated constant. @@ -3337,6 +3407,11 @@ The returned value of the parameter. True on success and false otherwise. + + + Gets a value indicating whether transformation to some target projection was opened with GeoProjection.StartTransform() call. + + Opens transformation to the specified target projection. The transformation will be used by GeoProjection. @@ -3375,6 +3450,16 @@ as ExportToWKT may add defaults for parameters missing in initial Proj4 definition. \new491 Added in version 4.9.1 + + + Gets a value indicating whether the object can be changed. + + + When frozen all the methods which can change the inner state of object will fail. + The property is set to true for map projection applied with AxMap.SetGeoProjection (see details there). + + \new491 Added in version 4.9.1 + Sets so called Google Mercator projection (aka Spherical Mercator; EPSG:3857), @@ -3404,6 +3489,11 @@ True on success. \new491 Added in version 4.9.1 + + + Gets the linear units from projection definition. + + Writes projection string to a file. @@ -3429,97 +3519,6 @@ Resulting string. \new494 Added in version 4.9.4 - - - Returns the name of the coordinate system. - - An empty string will be returned unless GeoProjection.IsGeographic property returns true. - - - - Gets or sets a callback object which is used to report errors. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Returns the inverse flattening of the reference ellipsoid of the coordinate system. - - - - - Gets a boolean value which indicates whether any projection definition is stored in the object. - - - - - Gets a boolean value which indicates whether the coordinate system stored in the object is the geographic one. - - - - - Gets a boolean value which indicates whether the coordinate system stored in the object is the local one. - - - - - Gets a boolean value which indicates whether the coordinate system stored in the object is the projected one. - - - - - A text string associated with the instance of the class. Any value can be stored by developer in this property. - - - - - Retrieves the numeric code of the last error that took place in the class. - - The usage of this property clears the error code. - - - - Returns the name of the coordinate system. - - Either GeoProjection.GeogCSName or GeoProjection.ProjectionName will be returned - depending on the type of coordinate system. - - - - The name of the projected coordinate system. - - An empty string will be returned unless GeoProjection.IsProjected property returns true. - - - - Returns the half of the major axis of the reference ellipsoid. - - - - - Returns the half of the minor axis of the reference ellipsoid. - - - - - Gets a value indicating whether transformation to some target projection was opened with GeoProjection.StartTransform() call. - - - - - Gets a value indicating whether the object can be changed. - - - When frozen all the methods which can change the inner state of object will fail. - The property is set to true for map projection applied with AxMap.SetGeoProjection (see details there). - - \new491 Added in version 4.9.1 - - - - Gets the linear units from projection definition. - - An interface for callback objects which can be used to return information about progress and errors. @@ -3571,62 +3570,13 @@ Such properties may be removed afterwards (GlobalSettings.ShapefileFastUnion for example). \new48 Added in version 4.8 - + - Clears information about last GDAL error. + Gets a sets a value which defines the multiplication coefficient for data in decimal degrees. - Affects GdalLastErrorMsg, GdalLastErrorNo, GdalLastErrorType, GdalReprojectionErrorMsg properties. + The value is used for Clipper library due to the lack of built-in scaling in it. The default value is 10000.0. - - - Gets the localized version for a specified string used in GUI. - - String to get localized version for. - Localized string. - \new491 Added in version 4.9.1 - - - - Sets the localized version for a specified string used in GUI. - - String to set localized version for. - Localized string. - \new491 Added in version 4.9.1 - - - - Sets application credentials for Here Maps online tiles. - Without these credentials Here Maps providers are not available. See - details here. - - Application Id. Can be obtained by registering on the site of the service. - Application code. Can be obtained by registering on the site of the service. - \new493 Added in version 4.9.3 - - - - Requests URL address for tiles download from Bing Maps server. - - API key to test. - True if the Url for downloading for obtained. - \new493 Added in version 4.9.3 - - - - Starts logging of tile requests. - - The filename. - If set to true only errors will be logged. - True on success. - \new494 Added in version 4.9.4 - - - - Gets a sets a value which defines the multiplication coefficient for data in decimal degrees. - - The value is used for Clipper library due to the lack of built-in scaling in it. The default value is 10000.0. - - + Gets or sets a value which is used to weed out long narrow "splintered" polygons generated by geoprocessing routines. @@ -3682,6 +3632,12 @@ The default value is HighQualityMode. + + + Clears information about last GDAL error. + + Affects GdalLastErrorMsg, GdalLastErrorNo, GdalLastErrorType, GdalReprojectionErrorMsg properties. + Gets or sets a value which affects the speed of Shapefile.Union operation. @@ -3736,6 +3692,22 @@ \new491 Added in version 4.9.1 + + + Gets the localized version for a specified string used in GUI. + + String to get localized version for. + Localized string. + \new491 Added in version 4.9.1 + + + + Sets the localized version for a specified string used in GUI. + + String to set localized version for. + Localized string. + \new491 Added in version 4.9.1 + Gets or sets colour scheme to be used for rendering grids. @@ -3983,6 +3955,24 @@ \new493 Added in version 4.9.3 + + + Sets application credentials for Here Maps online tiles. + Without these credentials Here Maps providers are not available. See + details here. + + Application Id. Can be obtained by registering on the site of the service. + Application code. Can be obtained by registering on the site of the service. + \new493 Added in version 4.9.3 + + + + Requests URL address for tiles download from Bing Maps server. + + API key to test. + True if the Url for downloading for obtained. + \new493 Added in version 4.9.3 + Gets or sets the value indicating which compression mode will be used to compress image overviews. @@ -4055,6 +4045,22 @@ \new494 Added in version 4.9.4 + + + Share connection between layers (may be unstable). + For large read-only layers it will increase performance. + + \new494 Added in version 4.9.4 + + + + Starts logging of tile requests. + + The filename. + If set to true only errors will be logged. + True on success. + \new494 Added in version 4.9.4 + @@ -4063,6 +4069,11 @@ Projection string in proj4 format. True on success or false otherwise. + + + Returns the common dialog filter containing all supported file extensions in string format. + + Uses a cell's column and row position to find the center of the cell in projected map coordinates. @@ -4099,6 +4110,16 @@ Optional. The ICallback object that will receive the progress and error events during the creation of the new grid. A boolean value representing the success or failure of the creation of the new grid. + + + Returns the data type of the values stored in the grid. + + + + + The filename associated with the object. + + Returns an array with grid values which lie within specified bounds. @@ -4124,6 +4145,32 @@ Reference to the first element of the array of floats that will hold the row of values. True on success and false otherwise. + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + Returns the header of the grid. + + + + + Returns whether the grid is loaded in to RAM memory or not. + + + + + The key may be used by the programmer to store any string data associated with the object. + + + + + Retrieves the last error generated in the object. + + Opens a grid. @@ -4173,6 +4220,12 @@ Reference to the first element of the array of floats that will hold the row of values. True on success. + + + Gets grid colour scheme object used for rendering of the image representation of the grid, in case + the datasource has a color table (GTiff with indexed colors, for example). + + Changes the grid source without closing it. @@ -4222,6 +4275,21 @@ The index of the cell's row. The new value as variant data type. + + + The index of the active band within grid. + + Active band will be used on data extraction operation like Grid.get_Value, Grid.GetFloatWindow + and during creation of image proxy. + \new490 Added in version 4.9.0 + + + + Gets the value indicating whether grid source can be displayed by Image class without creation of proxy file. + + Check return value for the reason whey such rendering isn't possible. + \new491 Added in version 4.9.1 + Creates a proxy image file to display grid data. @@ -4231,6 +4299,12 @@ The format of proxy can be changed in GlobalSettings.GridProxyFormat. \new491 Added in version 4.9.1 + + + Gets extents of the grid. + + \new490 Added in version 4.9.0 + Generates colour scheme for the grid. @@ -4240,6 +4314,30 @@ Generated colour scheme or null if the operation failed. \new491 Added in version 4.9.1 + + + Gets the value indicating whether grid has a valid image proxy for visualization. + + To be considered valid the proxy must have proper name (with "_proxy" postfix) and colour scheme file (.mwleg). + Both this files must have older creation date than the grid source file itself. + \new491 Added in version 4.9.1 + + + + Returns the maximum value stored in the grid. + + + + + Returns the minimum value stored in the grid. + + + + + Gets the number of within the grid. + + \new490 Added in version 4.9.0 + Opens grid as image. @@ -4259,6 +4357,13 @@ True on success and false otherwise. \new490 Added in version 4.9.0 + + + Gets or sets the value indicating how the grid should be displayed. + + This value will be used in AxMap.AddLayer and Grid.OpenAsImage methods. + \new491 Added in version 4.9.1 + Removes proxy image file created for grid display. @@ -4287,6 +4392,13 @@ Color scheme or null if both retrieval and generation failed. \new491 Added in version 4.9.1 + + + Gets the type of grid source, which defines a) whether any grid source is opened and b) if so, what the inner representation of grid by MapWinGIS. + + The functionality and behaviour of various source types may differ. + \new490 Added in version 4.9.0 + Returns an array with grid values which lie within specified bounds. Double overload of Grid.GetFloatWindow method. @@ -4349,123 +4461,68 @@ The band or null if index is not valid. \new494 Added in version 4.9.4 - + - Returns the common dialog filter containing all supported file extensions in string format. + Gets the active band of the datasource. + \new494 Added in version 4.9.4 - + - Returns the data type of the values stored in the grid. + A grid color break object defines how a specified region of a grid will be colored. + Represents a part of the GridColorScheme. - + - The filename associated with the object. + Gets or sets the caption to display for the color break - + + + Gets or sets the way a break is colored. + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Returns the header of the grid. + Gets or sets the model used to color the break. - + - Returns whether the grid is loaded in to RAM memory or not. + Gets or sets the color representing the highest value in the color break. - + - The key may be used by the programmer to store any string data associated with the object. + Gets or sets the highest value in the color break. - + - Retrieves the last error generated in the object. + The key may be used by the programmer to store any string data associated with the object. - + - Gets grid colour scheme object used for rendering of the image representation of the grid, in case - the datasource has a color table (GTiff with indexed colors, for example). + Retrieves the last error generated in the object. - + - The index of the active band within grid. + Gets or sets the lowest value in the color break. - Active band will be used on data extraction operation like Grid.get_Value, Grid.GetFloatWindow - and during creation of image proxy. - \new490 Added in version 4.9.0 - - - Gets the value indicating whether grid source can be displayed by Image class without creation of proxy file. - - Check return value for the reason whey such rendering isn't possible. - \new491 Added in version 4.9.1 - - - - Gets extents of the grid. - - \new490 Added in version 4.9.0 - - - - Gets the value indicating whether grid has a valid image proxy for visualization. - - To be considered valid the proxy must have proper name (with "_proxy" postfix) and colour scheme file (.mwleg). - Both this files must have older creation date than the grid source file itself. - \new491 Added in version 4.9.1 - - - - Returns the maximum value stored in the grid. - - - - - Returns the minimum value stored in the grid. - - - - - Gets the number of within the grid. - - \new490 Added in version 4.9.0 - - - - Gets or sets the value indicating how the grid should be displayed. - - This value will be used in AxMap.AddLayer and Grid.OpenAsImage methods. - \new491 Added in version 4.9.1 - - - - Gets the type of grid source, which defines a) whether any grid source is opened and b) if so, what the inner representation of grid by MapWinGIS. - - The functionality and behaviour of various source types may differ. - \new490 Added in version 4.9.0 - - - - Gets the active band of the datasource. - - \new494 Added in version 4.9.4 - - + - A grid color break object defines how a specified region of a grid will be colored. + Gets or sets the lowest value in the color break. - Represents a part of the GridColorScheme. @@ -4474,106 +4531,101 @@ The error code for which the error message is required. The error message description for the specified error code. - - - Gets or sets the caption to display for the color break - - - + - Gets or sets the way a break is colored. + Gets or sets a value indicating whether the break is visible. + \new494 Added in version 4.9.4 - + - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + A grid color scheme defines how a grid will be colored. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + A grid color scheme may either contain grid color breaks created by + the user, or may use a predefined color scheme. - + - Gets or sets the model used to color the break. + Gets or sets the intensity of the ambient lighting for the color scheme. Only applies when creating hillshaded breaks. - + - Gets or sets the color representing the highest value in the color break. + Clears all color breaks in the color scheme. - + - Gets or sets the highest value in the color break. + Deletes the specified color break from the color scheme. + The index of the color break to be removed. - + - The key may be used by the programmer to store any string data associated with the object. + Restores the setings of the grid from the string generated by Grid.Serialize() method. + The string with grid settings. - + - Retrieves the last error generated in the object. + Gets the direction the light source is pointing for the color scheme in the form of a vector which originates from the light + source. This only applies to hillshaded breaks. + The direction the light source is pointing represented by a vector. - + - Gets or sets the lowest value in the color break. + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Gets or sets the lowest value in the color break. + Inserts a break at the specified position of the color scheme. + The position to insert the break at. + The grid color break. - + - Gets or sets a value indicating whether the break is visible. + Adds a break to the color scheme. - \new494 Added in version 4.9.4 + The grid color break. - + - A grid color scheme defines how a grid will be colored. + The key may be used by the programmer to store any string data associated with the object. - A grid color scheme may either contain grid color breaks created by - the user, or may use a predefined color scheme. - + - Clears all color breaks in the color scheme. + Retrieves the last error generated in the object. - + - Deletes the specified color break from the color scheme. + Gets the azimuth, or compass heading of the light source. Only applies to hillshaded breaks. - The index of the color break to be removed. - + - Restores the setings of the grid from the string generated by Grid.Serialize() method. + Gets the elevation of the light source. Only applies to hillshaded breaks. - The string with grid settings. - + - Gets the direction the light source is pointing for the color scheme in the form of a vector which originates from the light - source. This only applies to hillshaded breaks. + Gets or sets the intensity of the light source for the color scheme. Only applies to hillshaded breaks. - The direction the light source is pointing represented by a vector. - + - Inserts a break at the specified position of the color scheme. + The color to use for the color scheme when drawing grid cells with a no-data value. - The position to insert the break at. - The grid color break. - + - Adds a break to the color scheme. + Gets the number of color breaks in the color scheme. - The grid color break. @@ -4654,55 +4706,14 @@ True on suceess. \new494 Added in version 4.9.4 - - - Gets or sets the intensity of the ambient lighting for the color scheme. Only applies when creating hillshaded breaks. - - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - The key may be used by the programmer to store any string data associated with the object. - - - - - Retrieves the last error generated in the object. - - - - - Gets the azimuth, or compass heading of the light source. Only applies to hillshaded breaks. - - - - - Gets the elevation of the light source. Only applies to hillshaded breaks. - - - - - Gets or sets the intensity of the light source for the color scheme. Only applies to hillshaded breaks. - - - - - The color to use for the color scheme when drawing grid cells with a no-data value. - - - + - Gets the number of color breaks in the color scheme. + A grid header object is used to hold the information contained in a grid's header - + - A grid header object is used to hold the information contained in a grid's header + Gets or sets a text string with information about color table. This value doesn't affect grid processing. @@ -4711,23 +4722,6 @@ The grid header to copy setting from. - - - Retrieves the error message associated with the specified error code. - - The error code for which the error message is required. - The error message description for the specified error code. - - - - For inner use only. - - - - - Gets or sets a text string with information about color table. This value doesn't affect grid processing. - - Not implemented. Get or sets the geoprojection associated with grid header. @@ -4795,11 +4789,24 @@ Gets or sets the height of a cell in the grid represented by the grid header. + + + Retrieves the error message associated with the specified error code. + + The error code for which the error message is required. + The error message description for the specified error code. + + + + For inner use only. + + Represents an raster image of particular format which may be added to the map. - \dot digraph image_diagram { + \dot + digraph image_diagram { nodesep = 0.3; ranksep = 0.3; splines = ortho; @@ -4843,6 +4850,28 @@ Some properties and methods are applicable to the GDAL images only.\n + + \addtogroup image_gdal GDAL images + Here is a list of methods and properties that are specific for images accessed through GDAL library. + The properties and methods described here belong to Image class. + \dot + digraph image_common { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Image" URL="\ref Image"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="GDAL images" URL="\ref image_common"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + + Gets or sets the size of image buffer in percentage. + + The values less than 100 will increase performance of drawing at the cost of decreasing the visual quality. + Converts the position of pixel in image buffer to the map coordinates. @@ -4866,6 +4895,12 @@ True on success and false otherwise. \new48 Added in version 4.8 + + + Clears the cache of GDAL library which can be used for faster display. + + \new48 Added in version 4.8 + Loads the whole image in the memory buffer of specified size. Applicable for GDAL images only. @@ -4876,15 +4911,48 @@ True on successful loading and false otherwise. \new48 Added in version 4.8 - + - Sets no-data value for the image. Applicable for GDAL images only. + Returns the number of bands of GDAL image. - The pixels with this value will be treated as transparent. - The value to be set. + + + + Returns the number of overviews for GDAL image. + + \see Image.BuildOverviews. + \new48 Added in version 4.8 + + + + Gets the type of palette interpretation. Applicable for GDAL images only. + + The possible values are + - "Grayscale"; + - "Red, Green, Blue and Alpha"; + - "Cyan, Magenta, Yellow and Black"; + - "Hue, Lightness and Saturation"; + - "Unknown". + + + + Gets or sets a boolean value which indicates whether a histogram will be used. Applicable for GDAL images only. + + + + + Sets no-data value for the image. Applicable for GDAL images only. + + The pixels with this value will be treated as transparent. + The value to be set. A boolean output value which indicates the success of the operation. \new48 Added in version 4.8 + + + Returns a boolean value which indicates whether an image has a color table. Applicable for GDAL images only. + + Reloads the image buffer to represent the specified map extents. Applicable for GDAL images only. @@ -4898,6 +4966,49 @@ The number of image pixels which fall into the specified extents. This parameter is no longer used. + + + Returns true if the datasource represents RGB image. + + The property can be used to distinguish grid datasource from genuine images. + Implementation checks if all 3 R,G,B colors are set as color interpretation for GDAL bands. + Any additional bands will be ignored. + \new491 Added in version 4.9.1 + + + + Returns true if the image is warped, i.e. there are rotation parameters in world file. + + \new490 Added in version 4.9.0 + + + \addtogroup image_common Image common + Here is a list of methods and properties that are common for all images despite their source. + The properties and methods described here belong to Image class. + \dot + digraph image_management { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Image" URL="\ref Image"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Open and close" URL="\ref image_common"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + + Returns the filename of the datasource for an image. + + For proxy image grid filename will be renamed, in other cases Filename of Image itself. + \new491 Added in version 4.9.1 + + + + Returns the common dialog filter containing all supported file extensions in string format. + + Clears the image using the specified canvas color as the new color for every pixel in the image. @@ -4929,6 +5040,11 @@ The serialized string generated by Image.Serialize() method. \new48 Added in version 4.8 + + + The filename associated with the object. + + Opens an image from file. @@ -4941,6 +5057,16 @@ Optional. The ICallback object which will receive progress and error events while the image is being opened. A boolean value representing the success or failure of opening the image. + + + Gets the image object's image type. + + + + + Returns true when the image is loaded in RAM memory, and returns false when the image is not loaded in RAM memory. + + Changes the data source of the image object without the its closing. @@ -4966,6 +5092,31 @@ The serialized string. \new48 Added in version 4.8 + + + Gets or sets instance of the labels class associated with the image. + + \new48 Added in version 4.8 + + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + The key may be used by the programmer to store any string data associated with the object. + + + + + The source type of the image. + + Images start with istUninitialized state. After loading bmp images istDiskBased or istInMemory value will be set depending + on the value of inMem parameter. For GDAL images istGDALBased will be set. + \new48 Added in version 4.8 + Retrieves the error message associated with the specified error code. @@ -4973,7 +5124,54 @@ The error code for which the error message is required. The error message description for the specified error code. + + + Retrieves the last error generated in the object. + + + + + Gets or sets a boolean value which indicates how images with identical size and position on the map will be drawn. + + When set to true such images will be merged into a single bitmap. This may improve performance + in case of low number of data pixels (those which differ from the transparent color). The default value is false. + \new48 Added in version 4.8 + + + + Returns file handle for BMP image. For inner use only. + + + + + Get or sets an instance of GeoProjection class associated with the image. + + The property can't be set to NULL (there is always an instance of GeoProjection class associated with image). + \new493 Added in version 4.9.3 + + + + Returns true if image object is empty, i.e. not bound to some disk-based datasource and doesn't hold any in-memory data. + This property is the same as checking Image.SourceType = istUninitialized. + + + \addtogroup image_position Image position + Here is a list of methods and properties which affect position and scale of image, conversion between map units and image coordinates. + The properties and methods described here belong to Image class. + \dot + digraph image_management { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Image" URL="\ref Image"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Position" URL="\ref image_position"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Retrieves projection string from the associated .prj file. @@ -4987,6 +5185,16 @@ The projection string. True on success and false otherwise. + + + Returns the extents of the image. + + + + + Gets the height of the image in pixels. + + Converts coordinates of image's pixel to the screen coordinates. @@ -4997,6 +5205,48 @@ The resulting y coordinate of the map. \new48 Added in version 4.8 + + + Gets or sets the number of map units per image pixel for x axis. + + The changes of this value will result in scaling of the image horizontally. + \new48 Added in version 4.8 + + + + Gets or sets the number of map units per image pixel for y axis. + + The changes of this value will result in scaling of the image vertically. + \new48 Added in version 4.8 + + + + Gets the height of the image. + + This property should be used to return the total height of the image, as compared to the height of the image buffer. + The height of the image in pixels. + \new48 Added in version 4.8 + + + + Gets the width of the image. + + This property should be used to return the total width of the image, as compared to the width of the image buffer. + The width of the image in pixels. + \new48 Added in version 4.8 + + + + Gets or sets the x coordinate of the center of lower left pixel of the image in map units. + + \new48 Added in version 4.8 + + + + Gets or sets the y coordinate of the center of lower left pixel of the image in map units. + + \new48 Added in version 4.8 + Returns the coordinates of pixel in image buffer which correspond to the given point on the map. @@ -5017,7 +5267,50 @@ The row. \new48 Added in version 4.8 + + + Gets the width of the image in pixels. + + + + + Gets or sets the x coordinate of the center of the lower-left pixel in the image. + + + + + Gets or sets the y coordinate of the center of the lower-left pixel in the image. + + + + + Gets or sets the number of map units per pixel of image buffer for x axis. + + The set part of the property is not applicable for GDAL images. + + + + Gets or sets the number of map units per pixel of image buffer for y axis. + + The set part of the property is not applicable for GDAL images. + + \addtogroup image_visualization Image visualization + Here is a list of properties that affect the visualization of the image. + The properties and methods described here belong to Image class. + \dot + digraph image_visualization { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Image" URL="\ref Image"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Visualization" URL="\ref image_visualization"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Sets transparent color for image. @@ -5026,37 +5319,98 @@ It also set Image.UseSetTranparencyColor to true. \new491 Added in version 4.9.1 - + - Gets the data from the image and puts it into the selected bitmap in the specified device context. + The interpolation mode for images which are displayed with the resolution higher than original, i.e. after zoom in (down). - This function requires the width and height of the selected bitmap and the image to match. - Use of this function requires advanced knowledge in windows graphics concepts and is intended for advanced users only. - The handle to the device context. - A boolean value representing the success or failure of getting the device context handle for the image. - + - This function uses a bitmap selected in the specified device context handle as the data to copy into the image for which the - function is called. - This function requires the image to be the same width and height as the bitmap selected in the device context. - Use of this function requires advanced knowledge in windows graphics concepts and is intended for advanced users only. - The device context handle of the device context for which the selected bitmap is to be used to - copy the bits into the image used to call the function. - A boolean value representing success or failure of setting the image's bits using the bitmap - selected in the specified device context. + Gets or sets the drawing method of image. + + Was used temporarily while moving from GDI to GDI+ drawing. + \deprecated v 4.8. No longer used. - + - Gets a row of pixels from the image. + A boolean value which indicates whether an image will be displayed using a gray palette. - The row of pixels you want to get from the image. - An array which will return the pixels in the specified row of the image. - A boolean value representing the success or failure of getting the row of pixels from the image. - + - Returns the arrays with the unique colors of the image and their frequencies. + Gets or sets a color which is used as the transparency color for the image. + + + + + Gets or sets a second color which is used as the transparency color for the image. + + All the colors between TransparencyColor and TransparencyColor2 will be transparent. + This "between" relation is calculated for each color channel and then the results are combined by AND operation. + + + + Gets or sets the value which define alpha component of image colors (0.0-1.0). + + The values range from 0.0(fully transparent) to 1.0(fully opaque). + + + + The interpolation mode for images which are displayed with the resolution lower than original, i.e. after zooming out (up). + + + + + Gets or sets whether or not the transparency color is being used when the image is displayed. + + + + \addtogroup image_data Data access + Here is a list of methods and properties which provide access to the values of pixels. + The properties and methods described here belong to Image class. + \dot + digraph image_data { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Image" URL="\ref Image"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Data access" URL="\ref image_data"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + + Gets the data from the image and puts it into the selected bitmap in the specified device context. + + This function requires the width and height of the selected bitmap and the image to match. + Use of this function requires advanced knowledge in windows graphics concepts and is intended for advanced users only. + The handle to the device context. + A boolean value representing the success or failure of getting the device context handle for the image. + + + + This function uses a bitmap selected in the specified device context handle as the data to copy into the image for which the + function is called. + This function requires the image to be the same width and height as the bitmap selected in the device context. + Use of this function requires advanced knowledge in windows graphics concepts and is intended for advanced users only. + The device context handle of the device context for which the selected bitmap is to be used to + copy the bits into the image used to call the function. + A boolean value representing success or failure of setting the image's bits using the bitmap + selected in the specified device context. + + + + Gets a row of pixels from the image. + + The row of pixels you want to get from the image. + An array which will return the pixels in the specified row of the image. + A boolean value representing the success or failure of getting the row of pixels from the image. + + + + Returns the arrays with the unique colors of the image and their frequencies. For large images it's recommended to perform the operation with the smaller size of buffer to improve performance and possible RAM overuse. @@ -5065,6 +5419,11 @@ The output array of the same size with Colors array with the frequency of the each color. The number of unique colors. + + + Gets or sets the picture object. + + Gets the value of a pixel in the image. @@ -5081,6 +5440,29 @@ The column in the image for which the value is required. The value of the specified pixel in the image. + + + + Gets or sets the color scheme to render image with. + + This property should be used for grid datasources in the first place (when there is no build-in colors). + But may also be used for a single band of regular RGB/ARGB images for synthetic colors and hillshading. + When no custom color scheme is set, grid rendering is chosen the color scheme from Image.ImageColorScheme will be used. + \new491 Added in version 4.9.1 + + + + Gets the value which indicates whether an image object represents a visualization proxy for another datasource. + + Will return true if the image was opened with Grid.OpenAsImage only. When opened directly the link to the source grid will be lost. + \new491 Added in version 4.9.1 + + + + Returns true if the image is rendered as grid. + + \new491 Added in version 4.9.1 + Opens the datasource of the image as grid. @@ -5090,6 +5472,27 @@ otherwise the datasource of image itself. \new491 Added in version 4.9.1 + + + Gets the name of the source grid in case the image represent a visualization proxy for a grid. + + \new490 Added in version 4.9.0 + + + + Gets or sets index of band within datasource whose values should be used to apply color scheme. + + Other bands will ignored during display process. This is useful for multiband grids (e.g. NetCDF), + but may also be used with RGB images, to set synthetic colors for a single band. + \new491 Added in version 4.9.1 + + + + Indicate whether hillshade algorithm will be used for generation of image representation of the grid. + + The behaviour has changed in v4.9. Now when active it only switches ColoringType from Hillshade to Gradient. + In v.4.8. it used to have the same behaviour as Image.AllowExternalColorScheme. + Sets color scheme to use in process of generation of the image representation of the grid. @@ -5097,7 +5500,23 @@ The color scheme. True on success and false otherwise. + + + Gets or sets the predefined color scheme for the image. Applicable for GDAL images only. + + The color scheme is used for generation of image representation of the grid. + + + + Gets grid color scheme this proxy image was generated with. The method should be called for proxy images only: Image.IsGridProxy = true. + + Color scheme will be read from .mwleg XML file on the disk. + + \addtogroup image_newmembers New members + Here is a list of properties and methods added in the version 4.9.4. + The properties and methods described here belong to Image class.\n\n + @{ Gets the band with the specified index. @@ -5105,3278 +5524,3367 @@ Raster band. \new494 Added in version 4.9.4 - + - Gets the minimum value for the specified band. + Gets the GDAL driver which manages the current datasource. - Index of the band. \new494 Added in version 4.9.4 - + - Gets the maximum value for the specified band. + Gets the active band (the one used for rendering when grid rendering is on). - Index of the band. \new494 Added in version 4.9.4 - + - Gets the value of the specified pixel including the alpha component. + Gets the palette interpretation for the image. - The row. - The column. - 32bit unsigned integer value. \new494 Added in version 4.9.4 - + - Sets the value of the specified pixel including the alpha component. + Gets or sets the brightness of the image. - The row. - The column. - The value to set. \new494 Added in version 4.9.4 - + - Clears the overviews for the datasource. + Gets or sets the contrast of the image. \new494 Added in version 4.9.4 - + - Sets the band minimum maximum values for the band. Values outside of this range will not be rendered. + Gets or sets the saturation of the image. - Index of the band. - The minimum. - The maximum. - True on success. \new494 Added in version 4.9.4 - + - Calculates the minimum and maximum values for the specified band and caches them for further use. + Gets or sets the hue of the image. - Index of the band. - True on success. \new494 Added in version 4.9.4 - + - Gets or sets the size of image buffer in percentage. + Gets or sets the gamma correction value for the image. - The values less than 100 will increase performance of drawing at the cost of decreasing the visual quality. + \new494 Added in version 4.9.4 - + - Clears the cache of GDAL library which can be used for faster display. + Gets or sets the colorize intensity. - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - Returns the number of bands of GDAL image. + Gets or sets the color of the colorize. + \new494 Added in version 4.9.4 - + - Returns the number of overviews for GDAL image. + Gets or sets the index of the red band (used when RGB rendering is chosen). - \see Image.BuildOverviews. - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - Gets the type of palette interpretation. Applicable for GDAL images only. + Gets or sets the index of the green band (used when RGB rendering is chosen). - The possible values are - - "Grayscale"; - - "Red, Green, Blue and Alpha"; - - "Cyan, Magenta, Yellow and Black"; - - "Hue, Lightness and Saturation"; - - "Unknown". + \new494 Added in version 4.9.4 - + - Gets or sets a boolean value which indicates whether a histogram will be used. Applicable for GDAL images only. + Gets or sets the index of the blue band (used when RGB rendering is chosen). + \new494 Added in version 4.9.4 - + - Returns a boolean value which indicates whether an image has a color table. Applicable for GDAL images only. + Gets or sets a value indicating whether RGB band mapping will be used. + \see RedBandIndex, GreenBandIndex, BlueBandIndex, AlphaBandIndex + \new494 Added in version 4.9.4 - + - Returns true if the datasource represents RGB image. + Gets or sets a value indicating whether the band + set by Image.ActiveBandIndex will be used rather then RGB rendering. - The property can be used to distinguish grid datasource from genuine images. - Implementation checks if all 3 R,G,B colors are set as color interpretation for GDAL bands. - Any additional bands will be ignored. - \new491 Added in version 4.9.1 + \new494 Added in version 4.9.4 - + - Returns true if the image is warped, i.e. there are rotation parameters in world file. + Gets or sets the index of the alpha band. - \new490 Added in version 4.9.0 + \new494 Added in version 4.9.4 - + - Returns the filename of the datasource for an image. + Gets or sets a value indicating whether to use active band as an alpha band as well. - For proxy image grid filename will be renamed, in other cases Filename of Image itself. - \new491 Added in version 4.9.1 + \new494 Added in version 4.9.4 - + - Returns the common dialog filter containing all supported file extensions in string format. + Gets the minimum value for the specified band. + Index of the band. + \new494 Added in version 4.9.4 - + - The filename associated with the object. + Gets the maximum value for the specified band. + Index of the band. + \new494 Added in version 4.9.4 - + - Gets the image object's image type. + Gets or sets a value indicating whether colors should be reversed during gray scale rendering (i.e. the smallest values are white). + \new494 Added in version 4.9.4 - + - Returns true when the image is loaded in RAM memory, and returns false when the image is not loaded in RAM memory. + Gets or sets a value indicating whether built-in color table of the image will be ignored. + \new494 Added in version 4.9.4 - + - Gets or sets instance of the labels class associated with the image. + Gets the current rendering mode for the image (depends on the values of other properties). - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + Gets the value of the specified pixel including the alpha component. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + The row. + The column. + 32bit unsigned integer value. + \new494 Added in version 4.9.4 - + - The key may be used by the programmer to store any string data associated with the object. + Sets the value of the specified pixel including the alpha component. + The row. + The column. + The value to set. + \new494 Added in version 4.9.4 - + - The source type of the image. + Gets the index of the left most pixel of the original image that was included in the current buffer. - Images start with istUninitialized state. After loading bmp images istDiskBased or istInMemory value will be set depending - on the value of inMem parameter. For GDAL images istGDALBased will be set. - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - Retrieves the last error generated in the object. + Gets the index of the top most pixel of the original image that was included in the current buffer. + \new494 Added in version 4.9.4 - + - Gets or sets a boolean value which indicates how images with identical size and position on the map will be drawn. + Gets the active color scheme used for the rendering, it may be either default or custom one. - When set to true such images will be merged into a single bitmap. This may improve performance - in case of low number of data pixels (those which differ from the transparent color). The default value is false. - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - Returns file handle for BMP image. For inner use only. + Clears the overviews for the datasource. + \new494 Added in version 4.9.4 - + - Get or sets an instance of GeoProjection class associated with the image. + Sets the band minimum maximum values for the band. Values outside of this range will not be rendered. - The property can't be set to NULL (there is always an instance of GeoProjection class associated with image). - \new493 Added in version 4.9.3 + Index of the band. + The minimum. + The maximum. + True on success. + \new494 Added in version 4.9.4 - + - Returns true if image object is empty, i.e. not bound to some disk-based datasource and doesn't hold any in-memory data. - This property is the same as checking Image.SourceType = istUninitialized. + Calculates the minimum and maximum values for the specified band and caches them for further use. + Index of the band. + True on success. + \new494 Added in version 4.9.4 - + + - Returns the extents of the image. + Gets or sets the horizontal and vertical alignment of labels. - + - Gets the height of the image in pixels. + Restores the state of the object from the string. + A string generated by LabelCategory.Serialize() method. - + - Gets or sets the number of map units per image pixel for x axis. + Gets or sets the value which indicates whether the category will be used in the process of shapefile drawing. - The changes of this value will result in scaling of the image horizontally. - \new48 Added in version 4.8 - + - Gets or sets the number of map units per image pixel for y axis. + Gets or sets expression which defines shapes that belong to this category. - The changes of this value will result in scaling of the image vertically. - \new48 Added in version 4.8 - + - Gets the height of the image. + Gets or sets a boolean value which indicates whether font is bold. - This property should be used to return the total height of the image, as compared to the height of the image buffer. - The height of the image in pixels. - \new48 Added in version 4.8 - + - Gets the width of the image. + Gets or sets font color of labels. - This property should be used to return the total width of the image, as compared to the width of the image buffer. - The width of the image in pixels. - \new48 Added in version 4.8 - + - Gets or sets the x coordinate of the center of lower left pixel of the image in map units. + Gets or sets the second font color - \new48 Added in version 4.8 - + - Gets or sets the y coordinate of the center of lower left pixel of the image in map units. + Gets or sets the gradient for the font of labels. - \new48 Added in version 4.8 - + - Gets the width of the image in pixels. + Gets or sets a boolean value which indicates whether font is italic. - + - Gets or sets the x coordinate of the center of the lower-left pixel in the image. + Gets or sets font name to draw labels with. + The names of fonts or font families like "Arial" should be passed. - + - Gets or sets the y coordinate of the center of the lower-left pixel in the image. + Gets or sets the outline color of the font. + \see FontOutlineVisible - + - Gets or sets the number of map units per pixel of image buffer for x axis. + Gets or sets a boolean value which indicates whether outline of the font is visible. - The set part of the property is not applicable for GDAL images. + \see FontOutlineColor, FontOutlineWidth - + - Gets or sets the number of map units per pixel of image buffer for y axis. + Gets or sets the width in pixels of the font outline - The set part of the property is not applicable for GDAL images. + \see FontOutlineVisible - + - The interpolation mode for images which are displayed with the resolution higher than original, i.e. after zoom in (down). + Gets or sets the size of the font - + - Gets or sets the drawing method of image. + Gets or sets a boolean value which indicates whether font is striked out. - Was used temporarily while moving from GDI to GDI+ drawing. - \deprecated v 4.8. No longer used. - + - A boolean value which indicates whether an image will be displayed using a gray palette. + Gets or sets the transparency of the font. Values from 0 (opaque) to 255 (transparent) are accepted. - + - Gets or sets a color which is used as the transparency color for the image. + Gets or sets a boolean value which indicates whether the font is underlined. - + - Gets or sets a second color which is used as the transparency color for the image. + Gets or sets the back color of the frame. - All the colors between TransparencyColor and TransparencyColor2 will be transparent. - This "between" relation is calculated for each color channel and then the results are combined by AND operation. - + - Gets or sets the value which define alpha component of image colors (0.0-1.0). + Gets or sets the end color of the frame gradient. - The values range from 0.0(fully transparent) to 1.0(fully opaque). + \see FrameGradientMode - + - The interpolation mode for images which are displayed with the resolution lower than original, i.e. after zooming out (up). + Gets or sets the gradient mode for the label's frame. + Use gmNone value to disable gradient. - + - Gets or sets whether or not the transparency color is being used when the image is displayed. + Gets or set the outline color of the label's frame. - + - Gets or sets the picture object. + Gets or sets the outline color of the label's frame. - - + - Gets or sets the color scheme to render image with. + Gets or sets the width of the label's frame outline. - This property should be used for grid datasources in the first place (when there is no build-in colors). - But may also be used for a single band of regular RGB/ARGB images for synthetic colors and hillshading. - When no custom color scheme is set, grid rendering is chosen the color scheme from Image.ImageColorScheme will be used. - \new491 Added in version 4.9.1 - + - Gets the value which indicates whether an image object represents a visualization proxy for another datasource. + Gets or sets the horizontal distance from text to the border of label's frame - Will return true if the image was opened with Grid.OpenAsImage only. When opened directly the link to the source grid will be lost. - \new491 Added in version 4.9.1 - + - Returns true if the image is rendered as grid. + Gets or sets the vertical distance from text to the border of label's frame - \new491 Added in version 4.9.1 - + - Gets the name of the source grid in case the image represent a visualization proxy for a grid. + Gets or sets the transparency of the label's frame. Values from 0 to 255 are accepted. - \new490 Added in version 4.9.0 - + - Gets or sets index of band within datasource whose values should be used to apply color scheme. + Gets or sets the shape of the label's frame - Other bands will ignored during display process. This is useful for multiband grids (e.g. NetCDF), - but may also be used with RGB images, to set synthetic colors for a single band. - \new491 Added in version 4.9.1 + - + - Indicate whether hillshade algorithm will be used for generation of image representation of the grid. + Gets or sets a boolean value which indicates whether label's frame will be drawn. - The behaviour has changed in v4.9. Now when active it only switches ColoringType from Hillshade to Gradient. - In v.4.8. it used to have the same behaviour as Image.AllowExternalColorScheme. - + - Gets or sets the predefined color scheme for the image. Applicable for GDAL images only. + Gets or sets the color of the halo around the text of the label. - The color scheme is used for generation of image representation of the grid. - + - Gets grid color scheme this proxy image was generated with. The method should be called for proxy images only: Image.IsGridProxy = true. + Gets or sets the width of the halo around the text of the label. - Color scheme will be read from .mwleg XML file on the disk. - + - Gets the GDAL driver which manages the current datasource. + Gets or sets a boolean value which indicates whether a halo around text will be drawn. - \new494 Added in version 4.9.4 - + - Gets the active band (the one used for rendering when grid rendering is on). + Gets or sets the alignment of text within label's frame. - \new494 Added in version 4.9.4 + This property is commonly used for the alignment of multi-line labels. - + - Gets the palette interpretation for the image. + Gets or sets the orientation of the label relative to the polyline it belongs to. - \new494 Added in version 4.9.4 - + - Gets or sets the brightness of the image. + Gets or sets the maximum value for the specified label category in case an LabelCategory.Expression contains a range of values. - \new494 Added in version 4.9.4 + The property is used internally. - + - Gets or sets the contrast of the image. + Gets or sets the minimum value for the specified label category in case an LabelCategory.Expression contains a range of values. - \new494 Added in version 4.9.4 + The property is used internally. - + - Gets or sets the saturation of the image. + Gets or sets the name of the category. The names must not be unique. - \new494 Added in version 4.9.4 - + - Gets or sets the hue of the image. + Gets or sets the horizontal offset in pixels which is used to draw labels. - \new494 Added in version 4.9.4 + When labels are subject to the rotation, "horizontal" means "along text width". + \see Labels.AutoOffset property - + - Gets or sets the gamma correction value for the image. + Gets or sets the vertical offset in pixels which is used to draw labels. - \new494 Added in version 4.9.4 + When labels are subject to the rotation, "vertical" means "along text height". + \see Labels.AutoOffset property - + - Gets or sets the colorize intensity. + The property isn't implemented. - \new494 Added in version 4.9.4 - + - Gets or sets the color of the colorize. + Returns the state of the object in the XML-formatted string. - \new494 Added in version 4.9.4 + Use LabelCategory.Deserialize() to restore the state. + Serialized string - + - Gets or sets the index of the red band (used when RGB rendering is chosen). + Gets or sets a color of shadow for the text of the label. - \new494 Added in version 4.9.4 + \see ShadowVisible, ShadowOffsetX, ShadowOffsetY - + - Gets or sets the index of the green band (used when RGB rendering is chosen). + Gets or sets the horizontal distance between text of the label and its shadow. - \new494 Added in version 4.9.4 + When labels are subject to the rotation, "horizontal" means "along text width" + \see ShadowOffsetY, ShadowVisible - + - Gets or sets the index of the blue band (used when RGB rendering is chosen). + Gets or sets the horizontal distance between text of the label and its shadow. - \new494 Added in version 4.9.4 + When labels are subject to the rotation, "vertical" means "along text height" + \see ShadowOffsetX, ShadowVisible - + - Gets or sets a value indicating whether RGB band mapping will be used. + Gets or sets a boolean value which indicates whether shadow of the label will be visible. - \see RedBandIndex, GreenBandIndex, BlueBandIndex, AlphaBandIndex - \new494 Added in version 4.9.4 + \see ShadowColor, ShadowOffsetX, ShadowOffsetY - + - Gets or sets a value indicating whether the band - set by Image.ActiveBandIndex will be used rather then RGB rendering. + Gets or sets a boolean value which indicates whether shapes that belongs to the category + will be visible. - \new494 Added in version 4.9.4 - + - Gets or sets the index of the alpha band. + Gets or sets the maximum font size fo the category. \new494 Added in version 4.9.4 - + - Gets or sets a value indicating whether to use active band as an alpha band as well. + Represents a single label on the map. - \new494 Added in version 4.9.4 + \dot + digraph label_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + lb [ label="Label" URL="\ref Label"]; + + node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; + lbs [ label="Labels" URL="\ref Labels"]; + + edge [ dir = "none", arrowhead="open", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + lbs -> lb [ URL="\ref Labels.get_Label()", tooltip = "Labels.get_Label()", headlabel = " n"]; + } + \enddot + + Graph description\n\n + Multipart shapes can have separate labels for every part. Each of such labels is represented by the instance of Label class. + Labels added to the map can be accessed via Labels.get_Label() property. It's not recommended to store instances of this class + retrieved from the map after the layer they belong to was removed.\n\n + This code demonstrate how to move the label for a shape with a given index. + \code + Shapefile sf = some_shapefile; + int shapeIndex = 10; // the index of shape we want to move + + // retrieving label object + Label label = sf.Labels.get_Label(shapeIndex, 0); // 0 - the first part + if (label != null) + { + // is it currently displayed on the screen? + Debug.Print("The label is drawn: " + label.IsDrawn.ToString()); + + label.x += 10.0; // let's move it to the right by 10 map units + label.y -= 5.0; // let's move it to the bottom by 5 map units + label.Visible = true; // ensure that it's visible + + Debug.Print("The text of the label: " + label.Text); + map.Redraw(); // redraw is needed to see the changes of position + } + else { + Debug.Print(string.Format("The chart with index {0} doesn't exists", shapeIndex)); + } + \endcode + \new48 Added in version 4.8 - + - Gets or sets a value indicating whether colors should be reversed during gray scale rendering (i.e. the smallest values are white). + The index of visualization category the label belongs to. - \new494 Added in version 4.9.4 + The value -1 indicates that the label doesn't belong to any visualization category and + default drawing options specified in the Labels class will be used for it's drawing. - + - Gets or sets a value indicating whether built-in color table of the image will be ignored. + Gets a boolean value which indicates whether the label was drawn at the current extents of the map. - \new494 Added in version 4.9.4 - + - Gets the current rendering mode for the image (depends on the values of other properties). + Gets or sets the angle of label rotation in degrees. Positive values set + clockwise rotation, negative - counter-clockwise. - \new494 Added in version 4.9.4 - + - Gets the index of the left most pixel of the original image that was included in the current buffer. + Gets the extents the label occupies on the map (in pixels). - \new494 Added in version 4.9.4 + In case the label wasn't drawn on the map, NULL reference will be returned. - + - Gets the index of the top most pixel of the original image that was included in the current buffer. + Gets or sets the text of the label. - \new494 Added in version 4.9.4 - + - Gets the active color scheme used for the rendering, it may be either default or custom one. + Gets or sets a boolean value which indicates whether the label is visible. - \new494 Added in version 4.9.4 + Call AxMap.Redraw() to see the effect of this property. - - + - Restores the state of the object from the string. + Gets or sets the horizontal position of the label in map coordinates. - A string generated by LabelCategory.Serialize() method. - + - Returns the state of the object in the XML-formatted string. + Gets or sets the vertical position of the label in map coordinates. - Use LabelCategory.Deserialize() to restore the state. - Serialized string - + - Gets or sets the horizontal and vertical alignment of labels. + Represents a list of labels of the map layer and their visualization options. + \dot + digraph labels_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + lcat [ label="LabelCategory" URL="\ref LabelCategory"]; + lb [ label="Label" URL="\ref Label"]; + + node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; + lbs [ label="Labels" URL="\ref Labels"]; + + node [style = dashed, color = gray]; + sf [ label="Shapefile" URL="\ref Shapefile"]; + img [ label="Image" URL="\ref Image"]; + + edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + sf -> lbs [ URL="\ref Shapefile.Labels", tooltip = "Shapefile.Labels", headlabel = " 1"]; + img -> lbs [ URL="\ref Image.Labels", tooltip = "Image.Labels", headlabel = " 1"]; + lbs -> lcat [ URL="\ref Labels.get_Category()", tooltip = "Labels.get_Category()", headlabel = " n"]; + lbs -> lb [ URL="\ref Labels.get_Label()", tooltip = "Labels.get_Label()", headlabel = " n"]; + } + \enddot + + Graph description\n\n + Here is a diagram with groups of API members of Labels class. + \dotfile labelsgroups.dot + Graph description + \new48 Added in version 4.8 - + - Gets or sets the value which indicates whether the category will be used in the process of shapefile drawing. + Gets or sets the global callback object which is used for passing to the client + an information about progress and errors. + An instance of the class which implements ICallback interface should be passed. + The class should be implemented by caller. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Gets or sets expression which defines shapes that belong to this category. + A text string associated with the instance of the class. Any value can be stored by developer in this property. - + - Gets or sets a boolean value which indicates whether font is bold. + Marks that values of size field have changed and the size of labels should be recalculated on the next redraw. + \new494 Added in version 4.9.4 - + - Gets or sets font color of labels. + Gets or sets the maximum font size for labels (when size field is used). + \new494 Added in version 4.9.4 - + - Gets or sets the second font color + Gets or sets a value indicating whether variable size for labels should be used + (in the range between Labels.FontSize, Labels.FontSize2). + \new494 Added in version 4.9.4 - + - Gets or sets the gradient for the font of labels. + Gets or sets a value indicating whether logarithmic scale will be used to calculate the size of labels. + \see Labels.UseVariableSize + \new494 Added in version 4.9.4 - + - Gets or sets a boolean value which indicates whether font is italic. + Returns the code of the last error which has occurred within the instance of class. - + - Gets or sets font name to draw labels with. + Gets the description of the specific error code. - The names of fonts or font families like "Arial" should be passed. + The error code returned by Labels.LastErrorCode. + The string with the description. - + - Gets or sets the outline color of the font. + Gets or sets the list of visualization options of labels. For inner use only. - \see FontOutlineVisible - + - Gets or sets a boolean value which indicates whether outline of the font is visible. + Gets or sets the values indicating whether GDI+ library should be used to draw labels. - \see FontOutlineColor, FontOutlineWidth + The default value is true. When set to false, GDI will be used for drawing. + In GDI mode no gradients and transparency is supported, while in some cases it can be somewhat faster then GDI+. - + - Gets or sets the width in pixels of the font outline + Gets a classification field used by unique values classification. - \see FontOutlineVisible + The property is used internally in couple with LabelCategory.MinValue and LabelCategory.MaxValue + to avoid the parsing of expressions for the categories in case unique values classification was applied. - + - Gets or sets the size of the font + Gets or sets the expression used to generate text of labels from the attribute table of the shapefile. + Applicable for the instances of Labels class associated with shapefile (obtained by Shapefile.Labels). - + - Gets or sets a boolean value which indicates whether font is striked out. + For labels attached to shapefile layer updates the text of each label based on Expression property. + The method is necessary when the values in underlying DBF table have changed, + since Labels class doesn't track these changes automatically. - + + + - Gets or sets the transparency of the font. Values from 0 (opaque) to 255 (transparent) are accepted. + Removes a visualization category with specified index. + The index of category to be removed. + True on successful removal and false otherwise. - + - Gets or sets a boolean value which indicates whether the font is underlined. + Adds a visualization category for labels. + Use LabelCategory.Expression or Label.Category to map specific labels to the newly + created category. + The name of the new category + The reference to the new category. - + - Gets or sets the back color of the frame. + Maps labels to the visualization categories. + LabelCategory.Expression property is analysed. + Afterwards Label.Category property is changed for all labels whose attributes comply with the expression. - + - Gets or sets the end color of the frame gradient. + Removes all the visualization categories. - \see FrameGradientMode - + - Gets or sets the gradient mode for the label's frame. + Generates visualization categories for labels based on certain field from the attribute + table of the parent shapefile. - Use gmNone value to disable gradient. + Use Labels.ApplyCategories to map particular labels to the generated categories based on the + LabelCategory.Expression property. + The index of field from the attribute table. + The type of classification. + Number of categories to be generated. It will be ignored for ctUniqueValues. + True on successful generation and false otherwise. - + - Gets or set the outline color of the label's frame. + Inserts a new visualization category at the given position of the list. + The index to insert the new category at. Should be greater or equal to 0 and less then + Labels.numCategories. + The name of the new category. + The reference to the newly created category. - + - Gets or sets the outline color of the label's frame. + Moves a specified label category down in the list. + The index of the category to move. + True on successful operation and false otherwise. - + - Gets or sets the width of the label's frame outline. + Moves a specified label category up in the list. + The index of the category to move. + True on successful operation and false otherwise. - + - Gets or sets the horizontal distance from text to the border of label's frame + Number of visualization categories associated with this instance of class. - + - Gets or sets the vertical distance from text to the border of label's frame + Applies color scheme to the visualization categories. + The method of interpolation. + Color scheme to take colors from. - + - Gets or sets the transparency of the label's frame. Values from 0 to 255 are accepted. + Applies color scheme to the visualization categories. + Allows to choose the part of label to apply colors to. + The method of interpolation. + Color scheme object to borrow colors from. + The element of the label to apply colors to. Labels.ApplyColorScheme is shortcut for using leDefault option. - + - Gets or sets the shape of the label's frame + Applies color scheme to the visualization categories. - + The method of interpolation. + Color scheme object to borrow colors from. + The element of the label to apply colors to. Labels.ApplyColorScheme is shortcut for using leDefault option. + The index of the first visualization category to apply colors to. + The index of the last visualization category to apply colors to. - + + \addtogroup labels_management Labels generation + Here is a list of properties and methods for adding labels (or their parts) to the map or removing them. + This module is a part of the documentation of Labels class. + \dot + digraph labels_management_graph { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Labels" URL="\ref Labels"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Managemant" URL="\ref labels_management"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ - Gets or sets a boolean value which indicates whether label's frame will be drawn. + Adds a new label as the last one in the list. + All the parameters passed to the method can be changed afterwards using Labels.get_Label() property. + The text of the new label. + The x coordinate of the new label. + The y coordinate of the new label. + The rotation of the label in degrees. Positive values set clockwise rotation, negative - counter-clockwise. + The index of visualization category to be used for the label drawing. + Default value is -1, which means the default drawing options will be used. - + - Gets or sets the color of the halo around the text of the label. + Adds a part to the label with specified index. + According to the shapefile specification shapes such as polylines or polygons can have multiple parts. + Use this method to add a separate label for each part of the parent shape. + The index of label to add a part to. + The text to be displayed. + The x coordinate of the part. + The y coordinate of the part. + The rotation of the label's part. + The index of visualization category to be used for the label drawing. + Default value is -1, which means the default drawing options will be used. - + - Gets or sets the width of the halo around the text of the label. + Removes all the labels and parts but not the visualization categories. - + - Gets or sets a boolean value which indicates whether a halo around text will be drawn. + Gets the number of labels. + Each label can have more then one part. - + - Gets or sets the alignment of text within label's frame. + Generates labels for each shape of the parent shapefile. - This property is commonly used for the alignment of multi-line labels. + Applicable for the instances of Labels class associated with shapefile, i.e. returned + by Shapefile.Labels property. + The expression to be used for generation of the text for labels. + The method to calculate position of each label. + A value which indicates whether labels should be created for each part of the + multipart shape or for the largest part only. + The number of generated labels. - + - Gets or sets the orientation of the label relative to the polyline it belongs to. + Inserts a new label at the given position. + The index to insert the label at. + The text of the label. + The x coordinate of the label. + The y coordinate of the label. + The angle of label rotation. + The index of the visualization category for the label. Use -1 if the label doesn't belong to any category. + True on success and false otherwise. - + - Gets or sets the maximum value for the specified label category in case an LabelCategory.Expression contains a range of values. + Inserts a new part for the specified label. - The property is used internally. + %Labels can have several parts which correspond to the parts of shapes they belong to. + The index of the label. + The index to insert the new part at. + The text of the label. + The x coordinate of the label. + The y coordinate of the label. + The rotation of the label in degrees. + The index of visualization category. Use -1 if the label doesn't belong to any category. + True on success or false otherwise. - + - Gets or sets the minimum value for the specified label category in case an LabelCategory.Expression contains a range of values. + Removes a label with the specified index. If the label is multipart then all its parts will be removed. - The property is used internally. + The index of the label to be removed. + True on success and false otherwise. - + - Gets or sets the name of the category. The names must not be unique. + Removes a part of label with the specified index. + The index of the label. + The index of part to be removed. + True on success and false otherwise. - + - Gets or sets the horizontal offset in pixels which is used to draw labels. + Gets or sets a boolean value which indicates whether labels should be synchronized with the parent shapefile. - When labels are subject to the rotation, "horizontal" means "along text width". - \see Labels.AutoOffset property + Synchronization means that labels will be automatically added or removed simultaneously with + the corresponding operation in the shapefile. + Labels can be synchronized only if their number is equal to the number of shapes. + + \see Labels.Count, Shapefile.NumShapes - + - Gets or sets the vertical offset in pixels which is used to draw labels. + Gets label with the specified index. - When labels are subject to the rotation, "vertical" means "along text height". - \see Labels.AutoOffset property + The index of label to return. + The part of the label to return. In case of single part labels 0 should be used. + A reference to the label or null reference in case of incorrect index. - + - The property isn't implemented. + Gets the number of parts for the label with specified index. + The index of the label. + The number of parts or -1 in case of incorrect index - + + \addtogroup labels_positioning Labels positioning + Here is a list of properties and methods which affects alignment, positioning and scale of labels. This module is a part of the documentation of Labels class. + \dot + digraph labels_positioning { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Labels" URL="\ref Labels"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Positioning" URL="\ref labels_positioning"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ - Gets or sets a color of shadow for the text of the label. + Map scale for which the size of labels will be equal to value set in Labels.FontSize property. - \see ShadowVisible, ShadowOffsetX, ShadowOffsetY + Applicable only when Label.Scale is set to true. - + - Gets or sets the horizontal distance between text of the label and its shadow. + Gets or sets the value which indicates whether the labels will change their size depending upon map scale. The default value is false. - When labels are subject to the rotation, "horizontal" means "along text width" - \see ShadowOffsetY, ShadowVisible + \see Labels.BasicScale - + - Gets or sets the horizontal distance between text of the label and its shadow. + Gets or sets the value which affects the sequence of labels drawing relative to the map layers. - When labels are subject to the rotation, "vertical" means "along text height" - \see ShadowOffsetX, ShadowVisible + See details in the description of tkVerticalPosition enumeration. - + - Gets or sets a boolean value which indicates whether shadow of the label will be visible. + Returns the indices of all labels which are displayed in the given part of the map. - \see ShadowColor, ShadowOffsetX, ShadowOffsetY - - - - Gets or sets a boolean value which indicates whether shapes that belongs to the category - will be visible. + This property doesn't change appearance of the labels. + The bounding box in screen coordinates. + The selection tolerance. + The selection mode. + An output array with indices of the labels. + An output array with indices of parts for each label. + True in case at least one label fell into selection. + + + + Gets or sets the method of label positioning. - + - Gets or sets the maximum font size fo the category. + Gets or sets the type of the label's orientation relative to the direction of the labelled shape. - \new494 Added in version 4.9.4 + Applicable for the instance of the Labels class associated with polyline shapefiles, + i.e. obtained by Shapefile.Labels property while Shapefile.ShapefileType is polyline. - + - Represents a single label on the map. + Gets or sets the horizontal offset in pixels which is used to draw labels. + + When labels are subject to the rotation, "horizontal" means "along the text width". + \see Labels.AutoOffset property + + + + Gets or sets the vertical offset in pixels which is used to draw labels. + + When labels are subject to rotation "vertical" means "along the text height". + \see Labels.AutoOffset property + + + + Gets or sets the value which defines an alignment of text within label's frame. + + Should be used with multiline labels. + + + + Turns on or off the auto offset behaviour. + + + When set to true, Labels.OffsetX and Labels.OffsetY property will be changed + automatically according to the size of symbols for parent shape points to avoid overlaps. + Applicable for point and multipoint shapefiles only. + + + + + Sets horizontal and vertical alignment of labels. + + + \addtogroup labels_serialization Labels serialization + Here is a list of methods and properties for serialization of labels and their persistence between the runs of application. + This module is a part of the documentation of Labels class. \dot - digraph label_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - lb [ label="Label" URL="\ref Label"]; - - node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; - lbs [ label="Labels" URL="\ref Labels"]; - - edge [ dir = "none", arrowhead="open", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - lbs -> lb [ URL="\ref Labels.get_Label()", tooltip = "Labels.get_Label()", headlabel = " n"]; + digraph labels_serialization { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Labels" URL="\ref Labels"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Serialization" URL="\ref labels_serialization"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; } \enddot - Graph description\n\n - Multipart shapes can have separate labels for every part. Each of such labels is represented by the instance of Label class. - Labels added to the map can be accessed via Labels.get_Label() property. It's not recommended to store instances of this class - retrieved from the map after the layer they belong to was removed.\n\n - This code demonstrate how to move the label for a shape with a given index. - \code - Shapefile sf = some_shapefile; - int shapeIndex = 10; // the index of shape we want to move - - // retrieving label object - Label label = sf.Labels.get_Label(shapeIndex, 0); // 0 - the first part - if (label != null) - { - // is it currently displayed on the screen? - Debug.Print("The label is drawn: " + label.IsDrawn.ToString()); - - label.x += 10.0; // let's move it to the right by 10 map units - label.y -= 5.0; // let's move it to the bottom by 5 map units - label.Visible = true; // ensure that it's visible - - Debug.Print("The text of the label: " + label.Text); - map.Redraw(); // redraw is needed to see the changes of position - } - else { - Debug.Print(string.Format("The chart with index {0} doesn't exists", shapeIndex)); - } - \endcode - \new48 Added in version 4.8 - - + It's possible to serialize different types of information for labels (charts):\n + -# The drawing settings, such visualization options, order of drawing, etc. It's desirable to save them in virtually any scenario.\n\n + -# The positions of the labels (charts). It makes sense to save them to avoid the recalculation of the positions on the next loading. + It's quite relevant even for middle sized datasets if the more or less complex routine for positioning is used + (Shape.Centroid, Shape.InteriorPoint).\n\n + -# The angles rotation, text and categories for labels. This type of information requires serialization less often. The text of labels + can be easily restored by applying Labels.Expression. Unless the Label.Text property was set manually. + In the same way categories rely on LabelCategory.Expression and will be serialized among the first group of settings, + unless Label.Category property was set manually. Finally the rotation of labels which is preserved less often. + . + The first group of settings is embedded in the larger XML body, either layer or map settings. It can be saved: + - to the file (see AxMap.SaveLayerOptions, AxMap.SaveMapState); + - returned as a string (see AxMap.SerializeLayer, AxMap.SerializeMapState). + . + For data described in the 2nd and 3rd sections more options are available by Labels.SavingMode property and tkSavingMode enumeration. It can be: + - not serialized at all (modeNone); + - embedded in the layer or map settings in the same way as the first group (modeStandard); + - written to stand-alone XML file with the name [LayerName].lbl (modeXML, modeXMLOverwrite); + - written to the dbf table of the shapefile (modeDBF). + . + @{ - The index of visualization category the label belongs to. + Saves position and text of the labels to the attribute table (dbf file). - The value -1 indicates that the label doesn't belong to any visualization category and - default drawing options specified in the Labels class will be used for it's drawing. + A value which indicates whether the text of labels will be saved. + A value which indicates whether the mapping between labels + and visualization categories will be saved. + True on success and false otherwise. - + - Gets a boolean value which indicates whether the label was drawn at the current extents of the map. + Saves positions and text of the labels to the attribute table (dbf file). + This method allows to specify the names of fields to save the data in. + The name of field to store x coordinate. + The name of field to store y coordinate. + The name of field to store angle. + The name of field to store text. + The name of field to store category. + A value which indicates whether the text of labels will be saved. + A value which indicates whether the mapping between labels and visualization categories will be saved. + True on success and false otherwise. - + - Gets or sets the angle of label rotation in degrees. Positive values set - clockwise rotation, negative - counter-clockwise. + Saves the text, positions and visualization options of the labels to the XML file. + The name of the file to save the settings to. + True on successful saving and false otherwise. + Use Labels.get_ErrorMsg() to find out the reason of failure. - + - Gets the extents the label occupies on the map (in pixels). + Gets or sets the method to save and restore the state labels. - In case the label wasn't drawn on the map, NULL reference will be returned. + See details in tkSavingMode enumeration. - + - Gets or sets the text of the label. + Loads text and position of labels from the attribute table of the parent shapefile. + Applicable for the instance of the Labels class associated with polyline shapefiles, + i.e. obtained by Shapefile.Labels property + A value which indicates whether the text of the labels should be loaded. + A value which indicates whether the mapping between labels and visualization categories should be restored. + True on successful loading and false otherwise. - + - Gets or sets a boolean value which indicates whether the label is visible. + Loads text and position of labels from the attribute table of the parent shapefile. - Call AxMap.Redraw() to see the effect of this property. + The name of field which holds x values. + The name of field which holds y values. + The name of field which holds rotation angles. + The name of the field which stores text of the labels. + The name of the field which stores index of visualization category for each label. + A value which indicates whether the text of the labels should be loaded. + A value which indicates whether the mapping between labels and visualization categories should be restored. + True on successful loading and false otherwise. - + - Gets or sets the horizontal position of the label in map coordinates. + Restores the state of the labels from the specified XML file. + The name of the file previously generated by Labels.SaveToXML method. + True on successful loading and false otherwise. - + - Gets or sets the vertical position of the label in map coordinates. + Saves the state of the labels. + Serialized state holds information about visualization options, categories and text expressions. \n\n + Optionally it can hold information about position and text of labels (see Labels.SavingMode property). + The default values of the properties will not be serialized. + A string with serialized state. On failure an empty string will be returned. - + - Represents a list of labels of the map layer and their visualization options. + Restores the state of the Labels class from the string. + A string with serialized state generated by Labels.Serialize() method. + + + \addtogroup labels_visibility Labels visibility + Here is list of properties and methods which affect visibility of labels. This module is a part of the documentation of Labels class. \dot - digraph labels_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - lcat [ label="LabelCategory" URL="\ref LabelCategory"]; - lb [ label="Label" URL="\ref Label"]; - - node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; - lbs [ label="Labels" URL="\ref Labels"]; - - node [style = dashed, color = gray]; - sf [ label="Shapefile" URL="\ref Shapefile"]; - img [ label="Image" URL="\ref Image"]; - - edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - sf -> lbs [ URL="\ref Shapefile.Labels", tooltip = "Shapefile.Labels", headlabel = " 1"]; - img -> lbs [ URL="\ref Image.Labels", tooltip = "Image.Labels", headlabel = " 1"]; - lbs -> lcat [ URL="\ref Labels.get_Category()", tooltip = "Labels.get_Category()", headlabel = " n"]; - lbs -> lb [ URL="\ref Labels.get_Label()", tooltip = "Labels.get_Label()", headlabel = " n"]; + digraph labels_visibility { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Labels" URL="\ref Labels"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Visibility" URL="\ref labels_visibility"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; } \enddot - - Graph description\n\n - Here is a diagram with groups of API members of Labels class. - \dotfile labelsgroups.dot Graph description - \new48 Added in version 4.8 - - + @{ - Marks that values of size field have changed and the size of labels should be recalculated on the next redraw. + Gets or sets the value which indicates whether the labels will be visible on the map. - \new494 Added in version 4.9.4 - + - Gets the description of the specific error code. + Gets or sets an expression which defines what shapes should be labelled on the map. - The error code returned by Labels.LastErrorCode. - The string with the description. + Applicable only to the instances of the Labels class associated with shapefile, i.e. + obtained by Shapefile.Labels property. + \code + Labels lb = new Labels(); + lb.VisibilityExpression = "[Area] > 100 and [population] > 100000"; + \endcode - + - For labels attached to shapefile layer updates the text of each label based on Expression property. + Is not implemented. - The method is necessary when the values in underlying DBF table have changed, - since Labels class doesn't track these changes automatically. - + - Gets the visualization category (LabelCategory) with the specified index. + Gets or sets the value which indicates whether labels with the same text should be drawn. - The index of the category to get. - The reference to the category or null in case of the incorrect index. + When set to true only the labels with unique text will be drawn on map. The choice of label + to draw depends on their position in the list and the fact of belonging to the visualization category. - - + - Removes a visualization category with specified index. + Gets or sets the maximum scale at which labels are visible on the map. - The index of category to be removed. - True on successful removal and false otherwise. + \see Labels.DynamicVisibility, AxMap.CurrentScale - + - Adds a visualization category for labels. + Gets or sets the minimum size of the shape in pixels to be labelled at the current map scale. - Use LabelCategory.Expression or Label.Category to map specific labels to the newly - created category. - The name of the new category - The reference to the new category. - + - Maps labels to the visualization categories. + Get or sets the minimum scale at which labels are visible on the map. - LabelCategory.Expression property is analysed. - Afterwards Label.Category property is changed for all labels whose attributes comply with the expression. + \see Labels.DynamicVisibility, AxMap.CurrentScale - + - Removes all the visualization categories. + Gets or sets the minimum zoom at which labels are visible on the map. - + - Generates visualization categories for labels based on certain field from the attribute - table of the parent shapefile. + Gets or sets the maximum zoom at which labels are visible on the map. - Use Labels.ApplyCategories to map particular labels to the generated categories based on the - LabelCategory.Expression property. - The index of field from the attribute table. - The type of classification. - Number of categories to be generated. It will be ignored for ctUniqueValues. - True on successful generation and false otherwise. - + - Inserts a new visualization category at the given position of the list. + Gets or sets the value which affects the collision avoidance routine. + Two labels are considered overlapping when the distance between their bounding rectangles + is less then this value. - The index to insert the new category at. Should be greater or equal to 0 and less then - Labels.numCategories. - The name of the new category. - The reference to the newly created category. + \see Labels.AvoidCollisions - + - Moves a specified label category down in the list. + Gets or sets the value which turns the dynamic visibility on or off. - The index of the category to move. - True on successful operation and false otherwise. + + When set to true, labels will be visible only in the range of scales set by Labels.MinVisibleScale and Labels.MinVisibleScale. + - + - Moves a specified label category up in the list. + Gets or sets the value which indicates whether a routine for preventing of label overlaps will be used. - The index of the category to move. - True on successful operation and false otherwise. + When set to true overlapping labels won't be drawn. - + + \addtogroup labels_visualization Labels visualization + Here is the list of visualization properties for labels. This module is a part of the documentation of Labels class.\n\n + The more details on the topic in the description of the LabelCategory class. The properties listed below are used for all labels + without specific visualization category set, i.e. Label.Category == -1; + \dot + digraph labels_visualization { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Labels" URL="\ref Labels"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Visualization" URL="\ref labels_visualization"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ - Applies color scheme to the visualization categories. + Gets or sets the color of the label's shadow. - The method of interpolation. - Color scheme to take colors from. + \see ShadowVisible - + - Applies color scheme to the visualization categories. + Gets or sets the horizontal offset of the label's shadow. - Allows to choose the part of label to apply colors to. - The method of interpolation. - Color scheme object to borrow colors from. - The element of the label to apply colors to. Labels.ApplyColorScheme is shortcut for using leDefault option. + \see ShadowVisible - + - Applies color scheme to the visualization categories. + Gets or sets the vertical offset of the label's shadow. - The method of interpolation. - Color scheme object to borrow colors from. - The element of the label to apply colors to. Labels.ApplyColorScheme is shortcut for using leDefault option. - The index of the first visualization category to apply colors to. - The index of the last visualization category to apply colors to. + \see ShadowVisible - + - Adds a new label as the last one in the list. + Gets or sets the value which indicates whether label's shadow is visible. - All the parameters passed to the method can be changed afterwards using Labels.get_Label() property. - The text of the new label. - The x coordinate of the new label. - The y coordinate of the new label. - The rotation of the label in degrees. Positive values set clockwise rotation, negative - counter-clockwise. - The index of visualization category to be used for the label drawing. - Default value is -1, which means the default drawing options will be used. - + - Adds a part to the label with specified index. + Gets or sets the color of the halo around label's text. - According to the shapefile specification shapes such as polylines or polygons can have multiple parts. - Use this method to add a separate label for each part of the parent shape. - The index of label to add a part to. - The text to be displayed. - The x coordinate of the part. - The y coordinate of the part. - The rotation of the label's part. - The index of visualization category to be used for the label drawing. - Default value is -1, which means the default drawing options will be used. + \see Labels.HaloVisible - + - Removes all the labels and parts but not the visualization categories. + Gets or sets the size of the halo drawn around label's text. + \see Labels.HaloVisible - + - Generates labels for each shape of the parent shapefile. + Gets or sets the value which indicates whether label's halo is visible. - Applicable for the instances of Labels class associated with shapefile, i.e. returned - by Shapefile.Labels property. - The expression to be used for generation of the text for labels. - The method to calculate position of each label. - A value which indicates whether labels should be created for each part of the - multipart shape or for the largest part only. - The number of generated labels. - + - Inserts a new label at the given position. + Gets or sets the value which indicates whether the font of labels is bold. - The index to insert the label at. - The text of the label. - The x coordinate of the label. - The y coordinate of the label. - The angle of label rotation. - The index of the visualization category for the label. Use -1 if the label doesn't belong to any category. - True on success and false otherwise. - + - Inserts a new part for the specified label. + Gets or sets the color of the label font. - %Labels can have several parts which correspond to the parts of shapes they belong to. - The index of the label. - The index to insert the new part at. - The text of the label. - The x coordinate of the label. - The y coordinate of the label. - The rotation of the label in degrees. - The index of visualization category. Use -1 if the label doesn't belong to any category. - True on success or false otherwise. - + - Removes a label with the specified index. If the label is multipart then all its parts will be removed. + Gets or sets the second color of the label font. It is used to set color gradient for the font. - The index of the label to be removed. - True on success and false otherwise. + \see Labels.FontGradientMode - + - Removes a part of label with the specified index. + Gets or sets the gradient mode for the labels. - The index of the label. - The index of part to be removed. - True on success and false otherwise. + \see Labels.FontColor2 - + - Gets label with the specified index. + Gets or sets the value which indicates whether the font of labels is italic. - The index of label to return. - The part of the label to return. In case of single part labels 0 should be used. - A reference to the label or null reference in case of incorrect index. - + - Gets the number of parts for the label with specified index. + Gets or sets the name of the font to draw labels with, e.g. Arial. - The index of the label. - The number of parts or -1 in case of incorrect index - + - Returns the indices of all labels which are displayed in the given part of the map. + Sets the color of the font outline. - This property doesn't change appearance of the labels. - The bounding box in screen coordinates. - The selection tolerance. - The selection mode. - An output array with indices of the labels. - An output array with indices of parts for each label. - True in case at least one label fell into selection. + \see Labels.FontOutlineVisible - + - Saves position and text of the labels to the attribute table (dbf file). + Gets or sets the value which indicates whether font outline is visible. The default value is false. - A value which indicates whether the text of labels will be saved. - A value which indicates whether the mapping between labels - and visualization categories will be saved. - True on success and false otherwise. - + - Saves positions and text of the labels to the attribute table (dbf file). + Gets or sets the width of the font outline. The default value is 1. - This method allows to specify the names of fields to save the data in. - The name of field to store x coordinate. - The name of field to store y coordinate. - The name of field to store angle. - The name of field to store text. - The name of field to store category. - A value which indicates whether the text of labels will be saved. - A value which indicates whether the mapping between labels and visualization categories will be saved. - True on success and false otherwise. + \see FontOutlineVisible - + - Saves the text, positions and visualization options of the labels to the XML file. + Gets or sets the size of the font to draw labels with. - The name of the file to save the settings to. - True on successful saving and false otherwise. - Use Labels.get_ErrorMsg() to find out the reason of failure. - + - Loads text and position of labels from the attribute table of the parent shapefile. + Gets or sets the value which indicates whether the font of labels is struck out. - Applicable for the instance of the Labels class associated with polyline shapefiles, - i.e. obtained by Shapefile.Labels property - A value which indicates whether the text of the labels should be loaded. - A value which indicates whether the mapping between labels and visualization categories should be restored. - True on successful loading and false otherwise. - + - Loads text and position of labels from the attribute table of the parent shapefile. + Gets or sets the transparency of the font. A values between 0 (transparent) to 255 (opaque) can be used. - The name of field which holds x values. - The name of field which holds y values. - The name of field which holds rotation angles. - The name of the field which stores text of the labels. - The name of the field which stores index of visualization category for each label. - A value which indicates whether the text of the labels should be loaded. - A value which indicates whether the mapping between labels and visualization categories should be restored. - True on successful loading and false otherwise. + The default value is 255. Values which fall outside the specified range will be + corrected to the closest acceptable value without reporting an error. - + - Restores the state of the labels from the specified XML file. + Gets or sets the value which indicates whether the font of labels is struck out. - The name of the file previously generated by Labels.SaveToXML method. - True on successful loading and false otherwise. - + - Saves the state of the labels. + Gets or sets the color of the frame's background. - Serialized state holds information about visualization options, categories and text expressions. \n\n - Optionally it can hold information about position and text of labels (see Labels.SavingMode property). - The default values of the properties will not be serialized. - A string with serialized state. On failure an empty string will be returned. + - + - Restores the state of the Labels class from the string. + Gets or sets the second color of the frame's background. - A string with serialized state generated by Labels.Serialize() method. + , Labels.FrameGradientMode - + - Gets or sets the global callback object which is used for passing to the client - an information about progress and errors. - - An instance of the class which implements ICallback interface should be passed. - The class should be implemented by caller. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - A text string associated with the instance of the class. Any value can be stored by developer in this property. + Gets or sets the type of gradient for the frame of the label. + + For all values other than gmNone a gradient + starting from Labels.FrameBackColor and ending by Labels.FrameBackColor2 will be applied. + - + - Gets or sets the maximum font size for labels (when size field is used). + Gets or sets the outline color of the label's frame - \new494 Added in version 4.9.4 + - + - Gets or sets a value indicating whether variable size for labels should be used - (in the range between Labels.FontSize, Labels.FontSize2). + Gets or sets the outline style of the label's frame. - \new494 Added in version 4.9.4 + - + - Gets or sets a value indicating whether logarithmic scale will be used to calculate the size of labels. + Gets or sets the width of the outline of the label's frame. - \see Labels.UseVariableSize - \new494 Added in version 4.9.4 + - + - Returns the code of the last error which has occurred within the instance of class. + Gets or sets the horizontal distance between the text of the label and its frame. - + - Gets or sets the list of visualization options of labels. For inner use only. + Gets or sets the vertical distance between the text of the label and its frame. - + - Gets or sets the values indicating whether GDI+ library should be used to draw labels. + Gets or sets the transparency of the label's frame. A values between 0 (transparent) to 255 (opaque) can be used. - The default value is true. When set to false, GDI will be used for drawing. - In GDI mode no gradients and transparency is supported, while in some cases it can be somewhat faster then GDI+. + The default value is 255. Values which fall outside the specified range will be + corrected to the closest acceptable value without reporting an error. - + - Gets a classification field used by unique values classification. + Gets or sets the shape of the label's frame. - The property is used internally in couple with LabelCategory.MinValue and LabelCategory.MaxValue - to avoid the parsing of expressions for the categories in case unique values classification was applied. - + - Gets or sets the expression used to generate text of labels from the attribute table of the shapefile. + Gets or sets the values which indicates whether label's frame is visible. - Applicable for the instances of Labels class associated with shapefile (obtained by Shapefile.Labels). - + - Number of visualization categories associated with this instance of class. + Gets or sets rendering hint to be used during GDI+ rendering. + This property will be ignored if GlobalSettings.AutoChooseRenderingHintForLabels is set to true. - + - Gets the number of labels. + Gets or sets the formatting to be used for floating point numbers during generation of labels. - Each label can have more then one part. + See acceptable formats in description of C printf function. + The commonly used values may be: %g (shortest representation), %.2f (two decimal points). + \new493 Added in version 4.9.3 - + - Gets or sets a boolean value which indicates whether labels should be synchronized with the parent shapefile. + Provides means for defining custom pattern from lines and point symbols for rendering polyline layers. - Synchronization means that labels will be automatically added or removed simultaneously with - the corresponding operation in the shapefile. - Labels can be synchronized only if their number is equal to the number of shapes. - - \see Labels.Count, Shapefile.NumShapes + The line pattern consists of line segments which can be representing by lines of various style, + width and color or by markers. Line segments are drawn one atop of the other in the sequence defined + in the line pattern. \n\n + Here is a diagram for the LinePattern class. + \dot + digraph pattern_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + segm [ label="LineSegment" URL="\ref LineSegment"]; + + node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; + ptrn [label="LinePattern" URL="\ref LinePattern"]; + + node [style = dashed, color = gray]; + sdo [ label="ShapeDrawingOptions" URL="\ref ShapeDrawingOptions"]; + + edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + sdo -> ptrn [ URL="\ref ShapeDrawingOptions.LinePattern", tooltip = "ShapeDrawingOptions.LinePattern", headlabel = " 1"]; + ptrn -> segm [ URL="\ref LinePattern.get_Line()", tooltip = "LinePattern.get_Line()", headlabel = " n"]; + } + \enddot + Graph description + \new48 Added in version 4.8 - + - Map scale for which the size of labels will be equal to value set in Labels.FontSize property. + Adds a line segment to the pattern. - Applicable only when Label.Scale is set to true. + The color of the line. + The width of the line. + The style of the line. - + - Gets or sets the value which indicates whether the labels will change their size depending upon map scale. The default value is false. + Adds a segment represented by point symbol (marker). - \see Labels.BasicScale + The type of the marker. + Reference to the newly added segment or NULL reference on failure. - + - Gets or sets the value which affects the sequence of labels drawing relative to the map layers. + Removes all the line segments from the pattern. - See details in the description of tkVerticalPosition enumeration. - + - Gets or sets the method of label positioning. + Returns the number of all segments in the pattern. - + - Gets or sets the type of the label's orientation relative to the direction of the labelled shape. + Restores the state of the line segment from the string. - Applicable for the instance of the Labels class associated with polyline shapefiles, - i.e. obtained by Shapefile.Labels property while Shapefile.ShapefileType is polyline. + A string generated by LinePattern.Serialize() method. - + - Gets or sets the horizontal offset in pixels which is used to draw labels. + Draws a line pattern on the specified device context. - When labels are subject to the rotation, "horizontal" means "along the text width". - \see Labels.AutoOffset property + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on successful drawing and false on failure. - + - Gets or sets the vertical offset in pixels which is used to draw labels. + Draws a line pattern on the specified device context. - When labels are subject to rotation "vertical" means "along the text height". - \see Labels.AutoOffset property + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on successful drawing and false on failure. - + - Gets or sets the value which defines an alignment of text within label's frame. + Gets or sets the global callback object which is used for passing to the client + the information about the progress of time consuming tasks and errors. - Should be used with multiline labels. + An instance of the class which implements ICallback interface should be passed. + The class should be implemented by caller. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Turns on or off the auto offset behaviour. + Inserts line definition at the specified position of the pattern. - - When set to true, Labels.OffsetX and Labels.OffsetY property will be changed - automatically according to the size of symbols for parent shape points to avoid overlaps. - Applicable for point and multipoint shapefiles only. - + The index to insert the new line segment at. + The color of the line. + The width of the line. + The style of the line. + True on success and false otherwise. - + - Sets horizontal and vertical alignment of labels. + Insert marker definition on the pattern at the specified position. + The index to insert the new segment at. + The type of marker. + True on success and false otherwise. - + - Gets or sets the method to save and restore the state labels. + Gets or sets a string value associated with the instance of the class. + It can store any information provided developer. - See details in tkSavingMode enumeration. - + - Gets or sets the value which indicates whether the labels will be visible on the map. + Retrieves the numeric code of the last error that took place in the class. + The usage of this property clears the error code. - + - Gets or sets an expression which defines what shapes should be labelled on the map. + Removes a segment stored at the specified position of the pattern. - Applicable only to the instances of the Labels class associated with shapefile, i.e. - obtained by Shapefile.Labels property. - \code - Labels lb = new Labels(); - lb.VisibilityExpression = "[Area] > 100 and [population] > 100000"; - \endcode + The position to remove the segment at. + True on success and false otherwise. - + - Is not implemented. + Saves the state of the object to the string. + A string with serialized state. - + - Gets or sets the value which indicates whether labels with the same text should be drawn. + Gets or sets the transparency of the line pattern. The value ranges from 0(opaque) to 255(transparent). - When set to true only the labels with unique text will be drawn on map. The choice of label - to draw depends on their position in the list and the fact of belonging to the visualization category. + The default value is 255. The setting affects the drawing of both lines and markers. - + - Gets or sets the maximum scale at which labels are visible on the map. + Gets the text description of the specified error code. - \see Labels.DynamicVisibility, AxMap.CurrentScale + The numeric error code retrieved by ShapeDrawingOptions.LastErrorCode property. + The description of the error. - + - Gets or sets the minimum size of the shape in pixels to be labelled at the current map scale. + Gets the reference to the line segment stored at the specified position in the pattern. + The index of the segment. + The reference to the line segment or NULL reference on failure. - + - Get or sets the minimum scale at which labels are visible on the map. + Changes line segment at the specified position to the new one. - \see Labels.DynamicVisibility, AxMap.CurrentScale + The index of segment. + The reference to the new segment. - + - Gets or sets the minimum zoom at which labels are visible on the map. + Holds information about a single line or marker in the line pattern represented by %LinePattern class. - - - - Gets or sets the maximum zoom at which labels are visible on the map. + Here is a diagram for the LineSegment class. + \dot + digraph segm_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + segm [ label="LineSegment" URL="\ref LineSegment"]; + + node [color = tan peripheries = 1 height = 0.3, width = 1.0]; + ptrn [ label="LinePattern" URL="\ref LinePattern"]; + + edge [ dir = "none", arrowhead="open", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + ptrn -> segm [ URL="\ref LinePattern.get_Line()", tooltip = "Labels.get_Line()", headlabel = " n"]; + } + \enddot + Graph description + \new48 Added in version 4.8 + + + + Gets or sets the color of the line or marker. - + - Gets or sets the value which affects the collision avoidance routine. - Two labels are considered overlapping when the distance between their bounding rectangles - is less then this value. + Draws a line segment on the specified device context. - \see Labels.AvoidCollisions + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on successful drawing and false on failure. - + - Gets or sets the value which turns the dynamic visibility on or off. + Draws a line segment on the specified device context. - - When set to true, labels will be visible only in the range of scales set by Labels.MinVisibleScale and Labels.MinVisibleScale. - + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on successful drawing and false on failure. - + - Gets or sets the value which indicates whether a routine for preventing of label overlaps will be used. + Gets or sets the style of the line. - When set to true overlapping labels won't be drawn. - + - Gets or sets the color of the label's shadow. + Gets or sets the type of the line segment, either line or marker. - \see ShadowVisible - + - Gets or sets the horizontal offset of the label's shadow. + Gets or sets the width of the line. - \see ShadowVisible - + - Gets or sets the vertical offset of the label's shadow. + Gets or sets the marker for the line segment. - \see ShadowVisible - + - Gets or sets the value which indicates whether label's shadow is visible. + Gets or sets the value which indicates whether the first marker in the line should be rotated by 180 degrees. - + - Gets or sets the color of the halo around label's text. + Gets or sets the interval between markers in pixels. - \see Labels.HaloVisible - + - Gets or sets the size of the halo drawn around label's text. + Gets or sets the offset for the marker. - \see Labels.HaloVisible + The first marker will be positioned with offset from + the beginning of polyline by this value. - + - Gets or sets the value which indicates whether label's halo is visible. + Gets or set the orientation of the marker symbols relative to the polyline. - + - Gets or sets the value which indicates whether the font of labels is bold. + Gets or sets the outline color of the marker. - + - Gets or sets the color of the label font. + Gets or sets the size of marker in pixels. - + + - Gets or sets the second color of the label font. It is used to set color gradient for the font. + Gets the measured area (in square meters if WGS84 compatible projection is set for map and in current square map units otherwise). - \see Labels.FontGradientMode - + - Gets or sets the gradient mode for the labels. + Clears all measurements. - \see Labels.FontColor2 - + - Gets or sets the value which indicates whether the font of labels is italic. + Saves the state of the class to the string + A string with the state or an empty string on failure. + \new493 Added in version 4.9.3 - + - Gets or sets the name of the font to draw labels with, e.g. Arial. + Restores the state of object from the string. + A string generated by Measuring.Serialize() method + True on success. + \new493 Added in version 4.9.3 - + - Sets the color of the font outline. + Finishes measuring. The measured path won't be cleared from map immediately. - \see Labels.FontOutlineVisible - + - Gets or sets the value which indicates whether font outline is visible. The default value is false. + Gets value indicating whether measurement was stopped. - + - Gets or sets the width of the font outline. The default value is 1. + Gets the length of measured path (in meters if WGS84 compatible projection is set for map and in current map units otherwise). - \see FontOutlineVisible - + - Gets or sets the size of the font to draw labels with. + The type of measurement, either distance or area. - + - Gets or sets the value which indicates whether the font of labels is struck out. + Gets or sets a value indicating whether the finished path will be preserved on map + when map cursor changes to something other than cmMeasure. - + - Gets or sets the transparency of the font. A values between 0 (transparent) to 255 (opaque) can be used. + Gets or sets a value indicating whether bearing of the line segments will be displayed. - The default value is 255. Values which fall outside the specified range will be - corrected to the closest acceptable value without reporting an error. + \new493 Added in version 4.9.3 - + - Gets or sets the value which indicates whether the font of labels is struck out. + Gets number of points in the measured path. - + - Gets or sets the color of the frame's background. + Undoes entering of the last point in the path. - + True on success. - + - Gets or sets the second color of the frame's background. + Gets an area within the path polygon including an additional point (typically the current position of mouse cursor). - , Labels.FrameGradientMode + X coordinate of the last point (in map coordinates). + Y coordinate of the last point (in map coordinates). + Area in square meters if WGS84 compatible projection is set for map and in current square map units otherwise. - + - Gets or sets the type of gradient for the frame of the label. + Gets coordinates of specified point in the path. - - For all values other than gmNone a gradient - starting from Labels.FrameBackColor and ending by Labels.FrameBackColor2 will be applied. - + Index of a point. + X coordinate of the point in map coordinates. + Y coordinate of the point in map coordinates. + True on success. - + - Gets or sets the outline color of the label's frame + Gets a value indicating whether calculations are performed taking into account the shape of Earth + (when map projection is defined), or on 2D plane (Euclidean geometry). - + \new491 Added in version 4.9.1 - + - Gets or sets the outline style of the label's frame. + Gets or sets a Callback object which handles progress and error messages. - + \new493 Added in version 4.9.3 + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Gets or sets the width of the outline of the label's frame. + Returns true if measured path contains at least one point. - + \new493 Added in version 4.9.3 - + - Gets or sets the horizontal distance between the text of the label and its frame. + Gets or sets type of the bearing to be display for line segments. + \new493 Added in version 4.9.3 - + - Gets or sets the vertical distance between the text of the label and its frame. + Gets or sets a value indicating whether length of the line segments will be displayed. + \new493 Added in version 4.9.3 - + - Gets or sets the transparency of the label's frame. A values between 0 (transparent) to 255 (opaque) can be used. + Gets or sets type of the length units to be displayed. - The default value is 255. Values which fall outside the specified range will be - corrected to the closest acceptable value without reporting an error. + \new493 Added in version 4.9.3 - + - Gets or sets the shape of the label's frame. + Gets or sets the area units to be displayed. + \new493 Added in version 4.9.3 - + - Gets or sets the values which indicates whether label's frame is visible. + Gets or sets angle format to be used to display bearing. + \new493 Added in version 4.9.3 - + - Gets or sets rendering hint to be used during GDI+ rendering. + Gets or sets the number of decimal degrees to be used to display bearing. - This property will be ignored if GlobalSettings.AutoChooseRenderingHintForLabels is set to true. + This setting is not used when AngleFormat is set to minutes or seconds. + \new493 Added in version 4.9.3 - + - Gets or sets the formatting to be used for floating point numbers during generation of labels. + Gets or sets the number of decimal degrees to be used to display area. - See acceptable formats in description of C printf function. - The commonly used values may be: %g (shortest representation), %.2f (two decimal points). \new493 Added in version 4.9.3 - + - Provides means for defining custom pattern from lines and point symbols for rendering polyline layers. + Gets or sets the number of decimal degrees to be used to display length. - The line pattern consists of line segments which can be representing by lines of various style, - width and color or by markers. Line segments are drawn one atop of the other in the sequence defined - in the line pattern. \n\n - Here is a diagram for the LinePattern class. - \dot - digraph pattern_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - segm [ label="LineSegment" URL="\ref LineSegment"]; - - node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; - ptrn [label="LinePattern" URL="\ref LinePattern"]; - - node [style = dashed, color = gray]; - sdo [ label="ShapeDrawingOptions" URL="\ref ShapeDrawingOptions"]; - - edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - sdo -> ptrn [ URL="\ref ShapeDrawingOptions.LinePattern", tooltip = "ShapeDrawingOptions.LinePattern", headlabel = " 1"]; - ptrn -> segm [ URL="\ref LinePattern.get_Line()", tooltip = "LinePattern.get_Line()", headlabel = " n"]; - } - \enddot - Graph description - \new48 Added in version 4.8 - - - - Adds a line segment to the pattern. - - The color of the line. - The width of the line. - The style of the line. - - - - Adds a segment represented by point symbol (marker). - - The type of the marker. - Reference to the newly added segment or NULL reference on failure. - - - - Removes all the line segments from the pattern. - - - - - Restores the state of the line segment from the string. - - A string generated by LinePattern.Serialize() method. - - - - Draws a line pattern on the specified device context. - - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on successful drawing and false on failure. - - - - Draws a line pattern on the specified device context. - - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on successful drawing and false on failure. + \new493 Added in version 4.9.3 - + - Inserts line definition at the specified position of the pattern. + Gets or sets a value indicating whether vertices of the measured path will be visible. - The index to insert the new line segment at. - The color of the line. - The width of the line. - The style of the line. - True on success and false otherwise. + \new493 Added in version 4.9.3 - + - Insert marker definition on the pattern at the specified position. + Gets or sets line color to display measured path. - The index to insert the new segment at. - The type of marker. - True on success and false otherwise. + \new493 Added in version 4.9.3 - + - Removes a segment stored at the specified position of the pattern. + Gets or sets fill color for polygon display. - The position to remove the segment at. - True on success and false otherwise. + \new493 Added in version 4.9.3 - + - Saves the state of the object to the string. + Gets or sets fill transparency for polygon display. - A string with serialized state. + \new493 Added in version 4.9.3 - + - Gets the text description of the specified error code. + Gets or sets line width to display measured path. - The numeric error code retrieved by ShapeDrawingOptions.LastErrorCode property. - The description of the error. + \new493 Added in version 4.9.3 - + - Gets the reference to the line segment stored at the specified position in the pattern. + Gets or sets line style to display measured path. - The index of the segment. - The reference to the line segment or NULL reference on failure. + \new493 Added in version 4.9.3 - + - Changes line segment at the specified position to the new one. + Gets or sets a value indicating whether labels with indices of points will be visible near the vertices. - The index of segment. - The reference to the new segment. + \new493 Added in version 4.9.3 - + - Returns the number of all segments in the pattern. + Gets or sets a value indicating whether accumulated length will be shown in brackets for each line segment. + \new493 Added in version 4.9.3 - + - Gets or sets the global callback object which is used for passing to the client - the information about the progress of time consuming tasks and errors. + Gets or sets the type of user input to be used to undo the last point of the measured path. - An instance of the class which implements ICallback interface should be passed. - The class should be implemented by caller. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + \new493 Added in version 4.9.3 - + - Gets or sets a string value associated with the instance of the class. - It can store any information provided developer. + A text string associated with object. Any value can be stored by developer in this property. + \new493 Added in version 4.9.3 - + - Retrieves the numeric code of the last error that took place in the class. + Gets the code of last error which took place inside this object. - The usage of this property clears the error code. + \new493 Added in version 4.9.3 - + - Gets or sets the transparency of the line pattern. The value ranges from 0(opaque) to 255(transparent). + Gets the description of the specific error code. - The default value is 255. The setting affects the drawing of both lines and markers. + The error code returned by LastErrorCode property. + String with the description. + \new493 Added in version 4.9.3 - + - Holds information about a single line or marker in the line pattern represented by %LinePattern class. + A point object represents a point with x, y, Z, and M values. Shapes created by adding point objects to the shape. - Here is a diagram for the LineSegment class. + Here is a diagram for the Point class. \dot - digraph segm_diagram { + digraph point_diagram { nodesep = 0.3; ranksep = 0.3; splines = ortho; node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - segm [ label="LineSegment" URL="\ref LineSegment"]; + pnt [ label="Point" URL="\ref Point"]; node [color = tan peripheries = 1 height = 0.3, width = 1.0]; - ptrn [ label="LinePattern" URL="\ref LinePattern"]; + shp [ label="Shape" URL="\ref Shape"]; - edge [ dir = "none", arrowhead="open", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - ptrn -> segm [ URL="\ref LinePattern.get_Line()", tooltip = "Labels.get_Line()", headlabel = " n"]; + edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + shp -> pnt [ URL="\ref Shape.get_Point()", tooltip = "Labels.get_Point()", headlabel = " n"]; } \enddot Graph description - \new48 Added in version 4.8 - - - - Draws a line segment on the specified device context. - - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on successful drawing and false on failure. - - - - Draws a line segment on the specified device context. - - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on successful drawing and false on failure. - + - Gets or sets the color of the line or marker. + Creates an exact copy of the point. + The new point. + \new48 Added in version 4.8 - + - Gets or sets the style of the line. + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + \deprecated v 4.9.3 %Point class doesn't define any callback or error messages. - + - Gets or sets the type of the line segment, either line or marker. + The key may be used by the programmer to store any string data associated with the object. + \deprecated v 4.9.3 Key string is no longer stored for performance reasons and to spare RAM. - + - Gets or sets the width of the line. + Retrieves the last error generated in the object. + \deprecated v 4.9.3 %Point class doesn't define any error messages. - + - Gets or sets the marker for the line segment. + Gets or sets the measure value of this point. Measures only apply to shapefiles with measure data. - + - Gets or sets the value which indicates whether the first marker in the line should be rotated by 180 degrees. + Gets or sets the Z value of this point. - + - Gets or sets the interval between markers in pixels. + Retrieves the error message associated with the specified error code. + The error code for which the error message is required. + The error message description for the specified error code. + \deprecated v 4.9.3 %Point class doesn't define any error messages. - + - Gets or sets the offset for the marker. + Gets or sets the x value of the point. - The first marker will be positioned with offset from - the beginning of polyline by this value. - + - Gets or set the orientation of the marker symbols relative to the polyline. + Gets or sets the y value of the point. - + - Gets or sets the outline color of the marker. + Sets the X, Y, and Z values of this point. + The new X value. + The new Y value. + Optional. The new Z value. Defaults to 0.0 if not specified. - + - Gets or sets the size of marker in pixels. + A shape object represents a geometric shape which can be added to a shapefile which is displayed in the map. - - - + Here is a diagram for the Shape class. + \dot + digraph shape_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + pnt [ label="Point" URL="\ref Point"]; + shp [ label="Shape" URL="\ref Shape"]; + + node [color = tan peripheries = 1 height = 0.3, width = 1.0]; + sf [ label="Shapefile" URL="\ref Shapefile"]; + + edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + shp -> pnt [ URL="\ref Shape.get_Point()", tooltip = "Table.get_Point()", headlabel = " n"]; + sf -> shp [ URL="\ref Shapefile.get_Shape()", tooltip = "Shapefile.get_Shape", headlabel = " n"]; + } + \enddot + Graph description + + - Clears all measurements. + Calculates the area of the shape. For non-polygon shapes this property will return 0.0. + The area will always be returned in current map units. + No corrections are made to take into account the curved shape of Earth. + \new48 Added in version 4.8 - + - Saves the state of the class to the string + Generates a shape which represents a boundary of the current shape. - A string with the state or an empty string on failure. - \new493 Added in version 4.9.3 + The reference to the resulting shape or NULL on failure. + \new48 Added in version 4.8 - + - Restores the state of object from the string. + Builds a buffer of the specified distance around the shape. - A string generated by Measuring.Serialize() method - True on success. - \new493 Added in version 4.9.3 + The buffer distance in map units. + The number of segments use to approximate a circle buffer. + The reference to the resulting shape which holds the buffer or NULL reference on failure. + \new48 Added in version 4.8 - + - Finishes measuring. The measured path won't be cleared from map immediately. + Calculates a center of the shape's bounding box. + \new48 Added in version 4.8 - + - Undoes entering of the last point in the path. + Calculates a centroid (center of mass) of the shape. - True on success. + \new48 Added in version 4.8 - + - Gets an area within the path polygon including an additional point (typically the current position of mouse cursor). + Performs clipping operation with 2 shapes. - X coordinate of the last point (in map coordinates). - Y coordinate of the last point (in map coordinates). - Area in square meters if WGS84 compatible projection is set for map and in current square map units otherwise. + The available operation are: + - difference; + - intersection; + - symmetrical difference; + - union; + . + Note that clClip operation will yield the same result as intersection. + + The second shape for the operation. + The operation to perform. + The reference to the resulting shape or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets coordinates of specified point in the path. + Creates a deep copy of this object with the same type, parts and points. - Index of a point. - X coordinate of the point in map coordinates. - Y coordinate of the point in map coordinates. - True on success. + The copy of the shape. + \new48 Added in version 4.8 - + - Gets the description of the specific error code. + Tests a "contains" relation between 2 shapes. - The error code returned by LastErrorCode property. - String with the description. - \new493 Added in version 4.9.3 + The second shape. + True if this shape contains the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets the measured area (in square meters if WGS84 compatible projection is set for map and in current square map units otherwise). + Builds a convex hull around the current shape. + A new shape with convex hull of the current shape or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets value indicating whether measurement was stopped. + Creates a new shape of the specified type. + The type of the shape to be created. + A boolean value representing the success or failure of creating the new shape. - + - Gets the length of measured path (in meters if WGS84 compatible projection is set for map and in current map units otherwise). - + Initializes the Shape object and fills it with the geometry defined by the input string. + The input string should be in the + serialized string format as produced by the function Shape.SerializeToString. + The serialized string to load. + A boolean value representing the success or failure of loading the shape. - + - The type of measurement, either distance or area. + Tests a "crosses" relation between 2 shapes. + The second shape. + True if this shape crosses the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets or sets a value indicating whether the finished path will be preserved on map - when map cursor changes to something other than cmMeasure. + Deletes a part from a shape. + The index of the part to be deleted. + A boolean value representing the success or failure of deleting the part. - + - Gets or sets a value indicating whether bearing of the line segments will be displayed. + Deletes a point in the shape. - \new493 Added in version 4.9.3 + The index of the point in the shape to be deleted. + A boolean value representing the success or failure of deleting the point in the shape. - + - Gets number of points in the measured path. + Tests a "disjoint" relation between 2 shapes. + The second shape. + True if this shape is disjoint from the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets a value indicating whether calculations are performed taking into account the shape of Earth - (when map projection is defined), or on 2D plane (Euclidean geometry). + Calculates the distance between 2 shapes. - \new491 Added in version 4.9.1 + The second shape. + The calculated distance. + \new48 Added in version 4.8 - + - Gets or sets a Callback object which handles progress and error messages. + Tests an "equals" relation between 2 shapes. - \new493 Added in version 4.9.3 - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + The second shape. + True if this shape is equal to the second shape and false if it is not. + \new48 Added in version 4.8 - + - Returns true if measured path contains at least one point. + Splits multipart shape into simple shapes. - \new493 Added in version 4.9.3 + Holes of the polygon will not be considered as separate shapes. However + if a polygon holds several not nested rings they will be passed to output as individual polygons. + The array of Shape type with the resulting shapes. + The on success and false otherwise. + \new48 Added in version 4.8 - + - Gets or sets type of the bearing to be display for line segments. + Returns binary representation of the shape data. - \new493 Added in version 4.9.3 + The binary data will have the same format as disk representation of the shapefile. + The byte array with shape data. + True on success and false otherwise. + \new48 Added in version 4.8 - + - Gets or sets a value indicating whether length of the line segments will be displayed. + Gets the extents of the shape. - \new493 Added in version 4.9.3 - + - Gets or sets type of the length units to be displayed. + Fixes the shape in case it is not valid. - \new493 Added in version 4.9.3 + Converts the data to GEOS geometry and builds a small buffer. + Call Shape.IsValid to find out the invalid shapes. + The fixed shape. + \new48 Added in version 4.8 - + - Gets or sets the area units to be displayed. + Fixes the shape in case it is not valid. - \new493 Added in version 4.9.3 + The units of measure of the coordinate system. + The fixed shape. + \new494 Added in version 4.9.4 - + - Gets or sets angle format to be used to display bearing. + Calculates the intersection of 2 shapes. - \new493 Added in version 4.9.3 + In comparison with Shape.Clip this function returns all the results of intersection + even if they have different shape type. For example the intersection of 2 polygons can hold: + new polygons, polylines and points simultaneously. + The second shape. + The array of Shape type with the results of intersection. + True in case at least one shape is returned and false otherwise. + \new48 Added in version 4.8 - + - Gets or sets the number of decimal degrees to be used to display bearing. + Gets or sets a callback object for reporting about the errors. - This setting is not used when AngleFormat is set to minutes or seconds. - \new493 Added in version 4.9.3 + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Gets or sets the number of decimal degrees to be used to display area. + Restores the state of the shape from binary representation obtained by Shape.ExportToBinary. - \new493 Added in version 4.9.3 + The byte array with the state of shape. + True on success and false otherwise. + \new48 Added in version 4.8 - + - Gets or sets the number of decimal degrees to be used to display length. + Inserts a part into the shape. - \new493 Added in version 4.9.3 + + Parts are used to create polygons with holes. Parts with points ordered in a clockwise direction + are filled. Parts with points ordered in a counter-clockwise direction are cut out. Only clockwise parts should be used to + define the outer-most regions of a shape. + + The index of the first point in the part to be inserted. + The part index desired. This value may be modified if it is not possible to use the desired part index. + A boolean value representing the success or failure of inserting the part into the shape. - + - Gets or sets a value indicating whether vertices of the measured path will be visible. + Inserts the specified point object into the shape using the desired point index if possible. - \new493 Added in version 4.9.3 + The point object to be inserted into the shape. + Reference parameter. The index where the point will be placed if possible. If the desired index + cannot be used, the actual index will be returned. + A boolean value representing the success or failure of inserting the point into the shape. - + - Gets or sets line color to display measured path. + Calculates the interior point of the shape. Is applicable for polygon shapes only. - \new493 Added in version 4.9.3 + The algorithm works as following: + - a line is defined which crosses the bounding box of the polygon horizontally in its center; + - the intersection of this line and polygon is calculated which can be represented by single segment or by a number of segments; + - the longest segment is then chosen and the point on it's center is returned. + \new48 Added in version 4.8 - + - Gets or sets fill color for polygon display. + Tests an "intersects" relation between 2 shapes. - \new493 Added in version 4.9.3 + The second shape. + True if this shape intersects the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets or sets fill transparency for polygon display. + Returns a boolean value which indicates whether a shape is valid. - \new493 Added in version 4.9.3 + + Shapes is considered to be valid when it meets specific topological rules for particular shape type. + + \new48 Added in version 4.8 - + - Gets or sets line width to display measured path. + Returns the string with the description of reason why shape was considered invalid. - \new493 Added in version 4.9.3 + \see Shape.IsValid. + \new48 Added in version 4.8 - + - Gets or sets line style to display measured path. + The key may be used by the programmer to store any string data associated with the object. - \new493 Added in version 4.9.3 - + - Gets or sets a value indicating whether labels with indices of points will be visible near the vertices. + Retrieves the last error generated in the object. - \new493 Added in version 4.9.3 - + - Gets or sets a value indicating whether accumulated length will be shown in brackets for each line segment. + Calculates the length of polyline shape. - \new493 Added in version 4.9.3 + The length will always be returned in current map units. + No corrections are made to take into account the curved shape of the Earth. - + - Gets or sets the type of user input to be used to undo the last point of the measured path. + Gets the number of parts contained in the shape. - \new493 Added in version 4.9.3 + A polygon shape may have several parts. An example of this would be a + doughnut shape. The outermost perimeter would be one part, and the hole cut out of the center making up the innermost + perimeter would be the second part. The outermost perimeter would be specified by a series of points arranged in clockwise + order, meaning that this part will be filled. The innermost perimeter would be specified by a series of points arranged in + counter-clockwise order, meaning that this part will not be filled. - + - A text string associated with object. Any value can be stored by developer in this property. + Tests an "overlaps" relation between 2 shapes. - \new493 Added in version 4.9.3 + The second shape. + True if this shape overlaps the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets the code of last error which took place inside this object. + Calculates the perimeter of shape. Is applicable for polygon shapes only. - \new493 Added in version 4.9.3 + The length will always be returned in current map units. + No corrections are made to take into account the curved shape of the Earth. + \new48 Added in version 4.8 - + - A point object represents a point with x, y, Z, and M values. Shapes created by adding point objects to the shape. + Performs a test to find out whether a given point lies within the polygon. - Here is a diagram for the Point class. - \dot - digraph point_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - pnt [ label="Point" URL="\ref Point"]; - - node [color = tan peripheries = 1 height = 0.3, width = 1.0]; - shp [ label="Shape" URL="\ref Shape"]; - - edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - shp -> pnt [ URL="\ref Shape.get_Point()", tooltip = "Labels.get_Point()", headlabel = " n"]; - } - \enddot - Graph description + The point to test. + True if points lies within polygon and false otherwise. - + - Creates an exact copy of the point. + Tests the specified relation between 2 shapes. - The new point. + This method works the same as individual overloads like Shape.Intersects, Shape.Overlaps, etc. + The second shape. + The relation to test. + True in case this relation is actually takes place and false if it is not. \new48 Added in version 4.8 - - - Retrieves the error message associated with the specified error code. - - The error code for which the error message is required. - The error message description for the specified error code. - \deprecated v 4.9.3 %Point class doesn't define any error messages. - - + - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + Changes the order of points within shape part to the opposite. - \deprecated v 4.9.3 %Point class doesn't define any callback or error messages. + The property can be useful to to ensure proper topology for polygons. + The points of outer ring of polygon must have clockwise order, while the points of its holes + must be specified in counter-clockwise order. + The index of part to reverse the order of points. + True on success and false otherwise. + \new48 Added in version 4.8 - + - The key may be used by the programmer to store any string data associated with the object. + Provides a string representing the shape's geometry. - \deprecated v 4.9.3 Key string is no longer stored for performance reasons and to spare RAM. + The string will be in the serialized string format and can be reloaded with Shape.CreateFromString. + A string representing the shape geometry. - + - Retrieves the last error generated in the object. + Gets or sets the type of the shape. - \deprecated v 4.9.3 %Point class doesn't define any error messages. + The shape's type must match the type of the shapefile the shape is to be added to + except for shapes of type SHP_NULLSHAPE. - + - Gets or sets the measure value of this point. Measures only apply to shapefiles with measure data. + Tests a "touches" relation between 2 shapes. + The second shape. + True if this shape touches the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets or sets the Z value of this point. + Tests a "within" relation between 2 shapes. + The second shape. + True if this shape lies within the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets or sets the x value of the point. + Returns the index of the last point in the part. + The index of the part. + The index of the point. + \new48 Added in version 4.8 - + - Gets or sets the y value of the point. + Retrieves the error message associated with the specified error code. + The error code for which the error message is required. + The error message description for the specified error code. - + - A shape object represents a geometric shape which can be added to a shapefile which is displayed in the map. + Gets or sets the first point index in the specified part. - Here is a diagram for the Shape class. - \dot - digraph shape_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - pnt [ label="Point" URL="\ref Point"]; - shp [ label="Shape" URL="\ref Shape"]; - - node [color = tan peripheries = 1 height = 0.3, width = 1.0]; - sf [ label="Shapefile" URL="\ref Shapefile"]; - - edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - shp -> pnt [ URL="\ref Shape.get_Point()", tooltip = "Table.get_Point()", headlabel = " n"]; - sf -> shp [ URL="\ref Shapefile.get_Shape()", tooltip = "Shapefile.get_Shape", headlabel = " n"]; - } - \enddot - Graph description + The index of the part for which the first point index is required. + The index of the first point in the specified part. - + - Generates a shape which represents a boundary of the current shape. + Returns part of the shape as a new shape. - The reference to the resulting shape or NULL on failure. + The initial shape and the returned one doesn't shape any common memory. + The index of part to return. + The reference to the new shape and NULL reference on failure. \new48 Added in version 4.8 - + - Builds a buffer of the specified distance around the shape. + Returns a boolean value which indicates whether points of the shape part are placed in the clockwise order. - The buffer distance in map units. - The number of segments use to approximate a circle buffer. - The reference to the resulting shape which holds the buffer or NULL reference on failure. + The index of part. + True for the clockwise order, and false for counter-clockwise. \new48 Added in version 4.8 - + - Performs clipping operation with 2 shapes. + Gets or sets the specified point in the shape. - The available operation are: - - difference; - - intersection; - - symmetrical difference; - - union; - . - Note that clClip operation will yield the same result as intersection. - - The second shape for the operation. - The operation to perform. - The reference to the resulting shape or NULL reference on failure. - \new48 Added in version 4.8 + The index of the point which is to be accessed in the shape. + The specified point in the shape. - + - Creates a deep copy of this object with the same type, parts and points. + Gets the coordinates of the specified point. - The copy of the shape. + It's highly recommended to use this property rather than Shape.get_Point, + for considerable performance boost when Shapefile.FastMode is set to true. + The index of point. + The x coordinate. + The y coordinate. + True on successful retrieval and false on wrong index of point. \new48 Added in version 4.8 - + - Tests a "contains" relation between 2 shapes. + Gets the number of points contained in the shape. - The second shape. - True if this shape contains the second shape and false if it is not. - \new48 Added in version 4.8 + There is a confusion with name casing for this property. + It's actually spelled 'get_NumPoints' in the source code. + However because of the known bug in PIA generation process the property + ended up spelled 'get_numPoints' in earlier version of PIAs. After some hesitation we decided to keep it that way. + See description of the bug here: http://stackoverflow.com/questions/3179676/c-exposed-property-for-com-in-idl-is-showing-as-lower-case-all-of-a-sudden - + - Builds a convex hull around the current shape. + Sets the coordinates of the specified point. - A new shape with convex hull of the current shape or NULL reference on failure. + It's highly recommended to use this property rather than Shape.get_Point, + for considerable performance boost when Shapefile.FastMode is set to true. + The index of point. + The x coordinate. + The y coordinate. + True on success and false on the invalid index. \new48 Added in version 4.8 - + - Creates a new shape of the specified type. + Sets the index of the first point in part. - The type of the shape to be created. - A boolean value representing the success or failure of creating the new shape. - - - - Initializes the Shape object and fills it with the geometry defined by the input string. - The input string should be in the - serialized string format as produced by the function Shape.SerializeToString. - The serialized string to load. - A boolean value representing the success or failure of loading the shape. + The index of part. + The index of point. - + - Tests a "crosses" relation between 2 shapes. + Replaces the point with the specified index with new one. - The second shape. - True if this shape crosses the second shape and false if it is not. - \new48 Added in version 4.8 + The index of point to replace. + The new point. - + - Deletes a part from a shape. + Adds a point to the shape. - The index of the part to be deleted. - A boolean value representing the success or failure of deleting the part. + The x coordinate of the point. + The y coordinate of the point. + The index of the new point. + \new490 Added in version 4.9.0 - + - Deletes a point in the shape. + Calculates closest points of the 2 shapes - The index of the point in the shape to be deleted. - A boolean value representing the success or failure of deleting the point in the shape. + Second shape + Polyline shape with 2 points, the first one - closest point of this shape, the second one - closest point of parameter shape. + Uses GEOS implementation, works for all shape types. For any point lying within polygon the closest point between it and polygon will be the point itself. + \new491 Added in version 4.9.1 - + - Tests a "disjoint" relation between 2 shapes. + Imports shape data from WKT format. - The second shape. - True if this shape is disjoint from the second shape and false if it is not. - \new48 Added in version 4.8 + Shape data in WKT format. + True on success and false otherwise. + \new491 Added in version 4.9.1 - + - Calculates the distance between 2 shapes. + Imports shape data from WKT format. - The second shape. - The calculated distance. - \new48 Added in version 4.8 + String in WKT format with shape data. + \new490 Added in version 4.9.0 - + - Tests an "equals" relation between 2 shapes. + Creates a deep copy of shape to another instance, including points and parts. - The second shape. - True if this shape is equal to the second shape and false if it is not. - \new48 Added in version 4.8 + Source shape to copy from. + True on success. + \new491 Added in version 4.9.1 - + - Splits multipart shape into simple shapes. + Gets M value for specified point. - Holes of the polygon will not be considered as separate shapes. However - if a polygon holds several not nested rings they will be passed to output as individual polygons. - The array of Shape type with the resulting shapes. - The on success and false otherwise. - \new48 Added in version 4.8 + Index of point. + M value. + True in case there are M values for current shape type. + \new491 Added in version 4.9.1 - + - Returns binary representation of the shape data. + Gets M value for specified point. - The binary data will have the same format as disk representation of the shapefile. - The byte array with shape data. - True on success and false otherwise. - \new48 Added in version 4.8 + Index of point. + Z value. + True in case there are Z values for current shape type. + \new491 Added in version 4.9.1 - + - Fixes the shape in case it is not valid. + Puts M value for specified point. - Converts the data to GEOS geometry and builds a small buffer. - Call Shape.IsValid to find out the invalid shapes. - The fixed shape. - \new48 Added in version 4.8 + Index of point. + M value. + True on success. + \new491 Added in version 4.9.1 - + - Fixes the shape in case it is not valid. + Puts Z value for specified point. - The units of measure of the coordinate system. - The fixed shape. - \new494 Added in version 4.9.4 + Index of point. + Z value. + True on success. + \new491 Added in version 4.9.1 - + - Calculates the intersection of 2 shapes. + Returns a new shape which constitutes a buffer around original one. - In comparison with Shape.Clip this function returns all the results of intersection - even if they have different shape type. For example the intersection of 2 polygons can hold: - new polygons, polylines and points simultaneously. - The second shape. - The array of Shape type with the results of intersection. - True in case at least one shape is returned and false otherwise. - \new48 Added in version 4.8 + Buffer width (same units as shape coordinates are set with). + Number of segments to approximate curves. + True if buffer if single sided buffer is needed (works for polylines only). + Type of caps. + Type of joins. + Mitre limit. + New buffered shape on success or null on failure. + \new493 Added in version 4.9.3 - + - Restores the state of the shape from binary representation obtained by Shape.ExportToBinary. + Moves shape at specified offset. - The byte array with the state of shape. - True on success and false otherwise. - \new48 Added in version 4.8 + X component of offset. + Y component of offset. + \new493 Added in version 4.9.3 - + - Inserts a part into the shape. + Rotates shape around specified point. - - Parts are used to create polygons with holes. Parts with points ordered in a clockwise direction - are filled. Parts with points ordered in a counter-clockwise direction are cut out. Only clockwise parts should be used to - define the outer-most regions of a shape. - - The index of the first point in the part to be inserted. - The part index desired. This value may be modified if it is not possible to use the desired part index. - A boolean value representing the success or failure of inserting the part into the shape. + X coordinate to rotate shape around. + Y coordinate to rotate shape around. + Angle in degrees. + \new493 Added in version 4.9.3 - + - Inserts the specified point object into the shape using the desired point index if possible. + Splits shape with a provided polyline. - The point object to be inserted into the shape. - Reference parameter. The index where the point will be placed if possible. If the desired index - cannot be used, the actual index will be returned. - A boolean value representing the success or failure of inserting the point into the shape. + Polyline shape to split with. + An array of Shape type. + True on success. + \new493 Added in version 4.9.3 - + - Tests an "intersects" relation between 2 shapes. + Removes all the points and parts. - The second shape. - True if this shape intersects the second shape and false if it is not. - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - Tests an "overlaps" relation between 2 shapes. + Gets "flattened" shape type, i.e. Z and M components will be ignored. - The second shape. - True if this shape overlaps the second shape and false if it is not. - \new48 Added in version 4.8 + \new493 Added in version 4.9.3 - + - Performs a test to find out whether a given point lies within the polygon. + Returns true if the shape doesn't have any points. - The point to test. - True if points lies within polygon and false otherwise. + \new493 Added in version 4.9.3 - + + - Tests the specified relation between 2 shapes. + Creates a new instance of ShapeDrawingOptions class by copying all the properties. - This method works the same as individual overloads like Shape.Intersects, Shape.Overlaps, etc. - The second shape. - The relation to test. - True in case this relation is actually takes place and false if it is not. - \new48 Added in version 4.8 + The reference to the new instance of the ShapeDrawingOptions class or NULL reference on failure. - + - Changes the order of points within shape part to the opposite. + Restores the state of object from the string. - The property can be useful to to ensure proper topology for polygons. - The points of outer ring of polygon must have clockwise order, while the points of its holes - must be specified in counter-clockwise order. - The index of part to reverse the order of points. - True on success and false otherwise. - \new48 Added in version 4.8 + A string generated by ShapeDrawingOptions.Serialize() method. - + - Provides a string representing the shape's geometry. + Draws a line using the stored options on specified device context. - The string will be in the serialized string format and can be reloaded with Shape.CreateFromString. - A string representing the shape geometry. + The method can be used to draw map legend. + The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the drawing. + The height of the drawing. + A value which indicates whether or not vertices of the line will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Tests a "touches" relation between 2 shapes. + Draws a line using the stored options on the specified device context. - The second shape. - True if this shape touches the second shape and false if it is not. - \new48 Added in version 4.8 - - - - Tests a "within" relation between 2 shapes. - - The second shape. - True if this shape lies within the second shape and false if it is not. - \new48 Added in version 4.8 + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the drawing. + The height of the drawing. + A value which indicates whether or not vertices of the line will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Returns the index of the last point in the part. + Draws a point symbol using the stored options on the specified device context. - The index of the part. - The index of the point. - \new48 Added in version 4.8 + The method can be used to draw map legend. + The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Retrieves the error message associated with the specified error code. + Draws a point symbol using the stored options on the specified device context. - The error code for which the error message is required. - The error message description for the specified error code. + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Gets or sets the first point index in the specified part. + Draws a rectangle using the stored options on the specified device context. - The index of the part for which the first point index is required. - The index of the first point in the specified part. + The method can be used to draw map legend. + The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the drawing. + The height of the drawing. + A value which indicates whether or not vertices of the rectangle will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Returns part of the shape as a new shape. + Draws a rectangle using the stored options on the specified device context. - The initial shape and the returned one doesn't shape any common memory. - The index of part to return. - The reference to the new shape and NULL reference on failure. - \new48 Added in version 4.8 + The method can be used to draw map legend. + The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the drawing. + The height of the drawing. + A value which indicates whether or not vertices of the rectangle will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Returns a boolean value which indicates whether points of the shape part are placed in the clockwise order. + Draws a shape using the stored options on the specified device context. - The index of part. - True for the clockwise order, and false for counter-clockwise. - \new48 Added in version 4.8 + The method can be used to draw map legend. + The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + A shape to draw. Point, polyline and polygon shapes are supported. + A value which indicates whether or not vertices of the line will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Gets or sets the specified point in the shape. + Draws a shape using the stored options on the specified device context. - The index of the point which is to be accessed in the shape. - The specified point in the shape. + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + A shape to draw. Point, polyline and polygon shapes are supported. + A value which indicates whether or not vertices of the line will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Gets the coordinates of the specified point. + The graphical mode to be used to render symbology. - It's highly recommended to use this property rather than Shape.get_Point, - for considerable performance boost when Shapefile.FastMode is set to true. - The index of point. - The x coordinate. - The y coordinate. - True on successful retrieval and false on wrong index of point. - \new48 Added in version 4.8 - + - Sets the coordinates of the specified point. + Gets or sets the background color of the polygon fill. - It's highly recommended to use this property rather than Shape.get_Point, - for considerable performance boost when Shapefile.FastMode is set to true. - The index of point. - The x coordinate. - The y coordinate. - True on success and false on the invalid index. - \new48 Added in version 4.8 + It is used for polygon shapes when hatch fill is chosen. + \see FillType - + - Sets the index of the first point in part. + Gets or sets the value which indicates whether a background will be drawn when ShapeDrawingOptions.FillType is set to ftHatch. - The index of part. - The index of point. - + - Replaces the point with the specified index with new one. + Gets or sets the fill color of the shape. - The index of point to replace. - The new point. + The color is used for point and polygon shapes when ShapeDrawingOptions.FillType is equal to ftSimple or ftHatch, + or the gradient starting color is ShapeDrawingOptions.FillType is equal to ftGradient. - + - Adds a point to the shape. + Gets or sets the end color of the gradient fill. - The x coordinate of the point. - The y coordinate of the point. - The index of the new point. - \new490 Added in version 4.9.0 + It is used when ShapeDrawingOptions.FillType is equal to ftGradient. - + - Calculates closest points of the 2 shapes + Gets or sets the the value which defines the bounds of the gradient fill. - Second shape - Polyline shape with 2 points, the first one - closest point of this shape, the second one - closest point of parameter shape. - Uses GEOS implementation, works for all shape types. For any point lying within polygon the closest point between it and polygon will be the point itself. - \new491 Added in version 4.9.1 - + - Imports shape data from WKT format. + The type of the gradient to draw polygon fill of the point symbols and polygon shapes. - Shape data in WKT format. - True on success and false otherwise. - \new491 Added in version 4.9.1 + \see FillType, FillColor, FillColor2. - + - Imports shape data from WKT format. + The hatch style of the fill for point symbols and polygon shapes. - String in WKT format with shape data. - \new490 Added in version 4.9.0 + \see FillType, FillBgColor, FillBgTransparent. - + - Creates a deep copy of shape to another instance, including points and parts. + Gets or sets the angle of rotation of the polygon fill in degrees. - Source shape to copy from. - True on success. - \new491 Added in version 4.9.1 + Affects the rotation of gradient and texture fill. + \see FillType - + - Gets M value for specified point. + Gets or sets the transparency of the fill. Ranges from 0 (transparent) to 255 (opaque). - Index of point. - M value. - True in case there are M values for current shape type. - \new491 Added in version 4.9.1 - + - Gets M value for specified point. + The type of the polygon fill. See the enumeration for details. - Index of point. - Z value. - True in case there are Z values for current shape type. - \new491 Added in version 4.9.1 - + - Puts M value for specified point. + Gets or sets the value which indicates whether the fill is visible. - Index of point. - M value. - True on success. - \new491 Added in version 4.9.1 + Affects the drawing of point symbols and polygon shapes. - + - Puts Z value for specified point. + The name of the font to use for drawing point symbols when ShapeDrawingOptions.PointType is equal to pstCharacter. - Index of point. - Z value. - True on success. - \new491 Added in version 4.9.1 - + - Returns a new shape which constitutes a buffer around original one. + Retrieves the numeric code of the last error that took place in the instance class. - Buffer width (same units as shape coordinates are set with). - Number of segments to approximate curves. - True if buffer if single sided buffer is needed (works for polylines only). - Type of caps. - Type of joins. - Mitre limit. - New buffered shape on success or null on failure. - \new493 Added in version 4.9.3 + The usage of this property clears the error code. - + - Moves shape at specified offset. + Gets or sets the line color of the shapes. - X component of offset. - Y component of offset. - \new493 Added in version 4.9.3 + Affects the drawing of all shape types. - + - Rotates shape around specified point. + Gets or sets line pattern for rendering polyline shapefile. - X coordinate to rotate shape around. - Y coordinate to rotate shape around. - Angle in degrees. - \new493 Added in version 4.9.3 - + - Splits shape with a provided polyline. + Gets or sets the line style of the shapes. - Polyline shape to split with. - An array of Shape type. - True on success. - \new493 Added in version 4.9.3 + Affects the drawing of all shape types. - + - Removes all the points and parts. + Gets or sets the transparency of lines. Ranges from 0 (transparent) to 255 (opaque). - \new494 Added in version 4.9.4 - + - Calculates the area of the shape. For non-polygon shapes this property will return 0.0. + Gets or sets the value which indicates whether lines will be visible while drawing shapes. - The area will always be returned in current map units. - No corrections are made to take into account the curved shape of Earth. - \new48 Added in version 4.8 + This affects drawing of polylines, as well as the drawing of outline of points symbols and polygons. - + - Calculates a center of the shape's bounding box. + Gets or sets the width of the lines to draw shapes. - \new48 Added in version 4.8 - + - Calculates a centroid (center of mass) of the shape. + Gets or sets the picture which will be used as texture brush (ShapeDrawingOptions.FillType = ftPicture) + or point symbol (ShapeDrawingOptions.PointType = ptSymbolPicture). - \new48 Added in version 4.8 + The property affects the drawing of point symbols and polygons. - + - Gets the extents of the shape. + Gets or sets the coefficient for scaling picture horizontally. - + - Gets or sets a callback object for reporting about the errors. + Gets or sets the coefficient for scaling picture vertically. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Calculates the interior point of the shape. Is applicable for polygon shapes only. + Get or sets the ANSI code of the text character to use as point symbol. - The algorithm works as following: - - a line is defined which crosses the bounding box of the polygon horizontally in its center; - - the intersection of this line and polygon is calculated which can be represented by single segment or by a number of segments; - - the longest segment is then chosen and the point on it's center is returned. - \new48 Added in version 4.8 - + - Returns a boolean value which indicates whether a shape is valid. + Gets or sets the rotation of the point symbol in degrees. - - Shapes is considered to be valid when it meets specific topological rules for particular shape type. - - \new48 Added in version 4.8 - + - Returns the string with the description of reason why shape was considered invalid. + Gets or sets the type of reflection to apply to the point symbol. - \see Shape.IsValid. - \new48 Added in version 4.8 + This value is used when ShapeDrawingOptions.PointType is equal to ptSymbolFontCharacter or ptSymbolPicture. + \new495 Added in version 4.9.5 - + - The key may be used by the programmer to store any string data associated with the object. + Gets or sets the predefined shape for the point symbol. + It is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. - + - Retrieves the last error generated in the object. + Gets or sets the number of sides for some of the predefined symbols such as regular, star or cross. + This value is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. - + - Calculates the length of polyline shape. + Gets or sets the side ratio for some of the predefined point symbols such as regular, star and cross. - The length will always be returned in current map units. - No corrections are made to take into account the curved shape of the Earth. + This value is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. - + - Gets the number of parts contained in the shape. + Gets or sets the size of the point symbol including predefined symbols, characters and pictures. - A polygon shape may have several parts. An example of this would be a - doughnut shape. The outermost perimeter would be one part, and the hole cut out of the center making up the innermost - perimeter would be the second part. The outermost perimeter would be specified by a series of points arranged in clockwise - order, meaning that this part will be filled. The innermost perimeter would be specified by a series of points arranged in - counter-clockwise order, meaning that this part will not be filled. - + - Calculates the perimeter of shape. Is applicable for polygon shapes only. + Gets or sets the type of the point symbols. - The length will always be returned in current map units. - No corrections are made to take into account the curved shape of the Earth. - \new48 Added in version 4.8 + The possible values include predefined symbols, text characters and pictures. - + - Gets or sets the type of the shape. + Saves the state of the class to the string - The shape's type must match the type of the shapefile the shape is to be added to - except for shapes of type SHP_NULLSHAPE. + A string with the state or an empty string on failure. - + - Gets the number of points contained in the shape. + Sets a predefined combination of properties to set the commonly used symbols. - There is a confusion with name casing for this property. - It's actually spelled 'get_NumPoints' in the source code. - However because of the known bug in PIA generation process the property - ended up spelled 'get_numPoints' in earlier version of PIAs. After some hesitation we decided to keep it that way. - See description of the bug here: http://stackoverflow.com/questions/3179676/c-exposed-property-for-com-in-idl-is-showing-as-lower-case-all-of-a-sudden + This method changes PointType, PointShape, PointSidesCount, PointRotation and PointSidesRatio properties. + The predefined symbol to be set. - + - Gets "flattened" shape type, i.e. Z and M components will be ignored. + Provides a convenient way to set colors of the gradient fill. - \new493 Added in version 4.9.3 + The central color of the gradient. + The range of colors of each channel the gradient covers. + The values should be within 0-255. - + - Returns true if the shape doesn't have any points. + Gets or sets a string associated with the instance of class. Can store any information provided by developer. - \new493 Added in version 4.9.3 - - + - Creates a new instance of ShapeDrawingOptions class by copying all the properties. + Gets or set the value which indicates whether line pattern will be used to render polyline shapefile. - The reference to the new instance of the ShapeDrawingOptions class or NULL reference on failure. + This property won't be set to true unless line pattern with at least one line exists. - + - Restores the state of object from the string. + Gets or sets the color of vertices for the shapes. - A string generated by ShapeDrawingOptions.Serialize() method. + \see VerticesVisible - + - Draws a line using the stored options on specified device context. + Gets or sets the value which indicates whether the fill for shape vertices will be drawn. - The method can be used to draw map legend. - The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the drawing. - The height of the drawing. - A value which indicates whether or not vertices of the line will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. + \see VerticesVisible - + - Draws a line using the stored options on the specified device context. + Gets or sets the size of the shapes's vertices - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the drawing. - The height of the drawing. - A value which indicates whether or not vertices of the line will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. - + - Draws a point symbol using the stored options on the specified device context. + Gets or sets the type of shape vertices. - The method can be used to draw map legend. - The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. - + - Draws a point symbol using the stored options on the specified device context. + Gets or sets the value which indicates whether vertices of the shape will be visible. The default values is false. - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. + The visibility of point symbols for point shapefiles is not affected by this property. - + - Draws a rectangle using the stored options on the specified device context. + Gets or sets the values which indicates whether shapes will be visible. - The method can be used to draw map legend. - The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the drawing. - The height of the drawing. - A value which indicates whether or not vertices of the rectangle will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. - + - Draws a rectangle using the stored options on the specified device context. + Gets the text description of the specified error code. - The method can be used to draw map legend. - The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the drawing. - The height of the drawing. - A value which indicates whether or not vertices of the rectangle will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. + The numeric error code retrieved by ShapeDrawingOptions.LastErrorCode property. + The description of the error. - + - Draws a shape using the stored options on the specified device context. + Gets or sets a value indicating whether hot spot of icons should be position at the bottom center. + When set to false the hotspot will be at the center of icon. - The method can be used to draw map legend. - The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - A shape to draw. Point, polyline and polygon shapes are supported. - A value which indicates whether or not vertices of the line will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. + \new491 Added in version 4.9.1 - + - Draws a shape using the stored options on the specified device context. + Gets or sets type of frame to be displayed around point when ShapeDrawingOptions.PointShape is set to ptSymbolFontCharacter. - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - A shape to draw. Point, polyline and polygon shapes are supported. - A value which indicates whether or not vertices of the line will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. + \new491 Added in version 4.9.1 - + - Saves the state of the class to the string + Gets or sets a value indicating whether a frame will be drawn around point when ShapeDrawingOptions.PointShape is set to ptSymbolFontCharacter. - A string with the state or an empty string on failure. + \new491 Added in version 4.9.1 - + - Sets a predefined combination of properties to set the commonly used symbols. + Gets or sets a value indicating whether the category will be displayed only + for scale range specified by MinVisibleScale and MaxVisibleScale properties - This method changes PointType, PointShape, PointSidesCount, PointRotation and PointSidesRatio properties. - The predefined symbol to be set. + \new493 Added in version 4.9.3 - + - Provides a convenient way to set colors of the gradient fill. + Gets or sets maximum map scale at which the category is visible + when ShapeDrawingOptions.DynamicVisibility is set to true. - The central color of the gradient. - The range of colors of each channel the gradient covers. - The values should be within 0-255. + \new493 Added in version 4.9.3 - + - Gets the text description of the specified error code. + Gets or sets minimum map scale at which the category is visible + when ShapeDrawingOptions.DynamicVisibility is set to true. - The numeric error code retrieved by ShapeDrawingOptions.LastErrorCode property. - The description of the error. + \new493 Added in version 4.9.3 - + - The graphical mode to be used to render symbology. + Represents a list of visualization categories which determine the appearance of the shapefile. + + Provides methods for: + - managing categories: ShapefileCategories.Add, ShapefileCategories.Insert(), ShapefileCategories.Remove, ShapefileCategories.Clear(); + - generation of categories based on the specified attribute: ShapefileCategories.Generate(); + - mapping of categories to particular shapes: ShapefileCategories.ApplyExpressions(); + - setting of common color scheme for the range of categories: ShapefileCategories.ApplyColorScheme(). + - accessing particular categories: ShapefileCategories.get_Item(). + + Here is a diagram for the ShapefileCategories class. + \dot + digraph shapefilecategories_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + cat [ label="ShapefileCategory" URL="\ref ShapefileCategory"]; + + node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; + lst [ label="ShapefileCategories" URL="\ref ShapefileCategories"]; + sdo [ label="ShapeDrawingOptions" URL="\ref ShapeDrawingOptions"]; + + node [style = dashed, color = gray]; + sf [ label="Shapefile" URL="\ref Shapefile"]; + + edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + cat -> sdo [ URL="\ref ShapefileCategory.DrawingOptions", tooltip = "ShapefileCategory.DrawingOptions", headlabel = " 1"]; + lst -> cat [ URL="\ref ShapefileCategories.get_Item()", tooltip = "ShapefileCategories.get_Item()", headlabel = " n"]; + sf -> lst [ URL="\ref Shapefile.Categories", tooltip = "Shapefile.Categories", headlabel = " 1"]; + } + + \enddot + Graph description + \new48 Added in version 4.8 - + - Gets or sets the background color of the polygon fill. + Creates a new visualization category, adds it to the list and returns its reference to the caller. - It is used for polygon shapes when hatch fill is chosen. - \see FillType + It's the responsibility of the developer to map the new category to the + particular shape by either: + - specifying ShapefileCategory.Expression and calling ShapefileCategories.ApplyExpression(); + - by using Shapefile.set_ShapeCategory() property; + . + The name of the new category. It must not be unique. + The reference to the newly created category or NULL reference on failure. - + - Gets or sets the value which indicates whether a background will be drawn when ShapeDrawingOptions.FillType is set to ftHatch. + Creates the specified number of visualization categories and expressions for them. + The method can be useful to override generation routine provided in ShapefileCategories.GenerateCategories() + which always generate categories covering the full range of values of the specified field. This method can + define the range of values explicitly, therefore certain values can be excluded from classification or on contrary + categories can be added for the values which aren't yet present in the table. + The index of the field to build classification by. + The type of the classification. + The number of categories to add. If ClassificationType equals ctUniqueValues this value will be skipped. + The minimal value of the field to include in the classification. + Th maximum value of the field to include in the classification. + True on successful adding and false otherwise. - + - Gets or sets the fill color of the shape. + Applies color scheme to the visualization categories. - The color is used for point and polygon shapes when ShapeDrawingOptions.FillType is equal to ftSimple or ftHatch, - or the gradient starting color is ShapeDrawingOptions.FillType is equal to ftGradient. + The method of interpolation. + Color scheme to take colors from. - + - Gets or sets the end color of the gradient fill. + Applies color scheme to the visualization categories. - It is used when ShapeDrawingOptions.FillType is equal to ftGradient. + The method of interpolation. + The color scheme to take colors from. + The element of the shape symbology to apply colors to. - + - Gets or sets the the value which defines the bounds of the gradient fill. + Applies color scheme to the visualization categories. + The method of interpolation. + The color scheme to take colors from. + The element of the shape symbology to apply colors to. + The index of the first category to apply colors to. + The index of the last category to apply colors to. - + - The type of the gradient to draw polygon fill of the point symbols and polygon shapes. + Maps particular shapes to the category based on ShapefileCategory.Expression. - \see FillType, FillColor, FillColor2. + The mapping between the category and shapes can be changed by Shapefile.set_ShapeCategory property. + The index of the category. - + - The hatch style of the fill for point symbols and polygon shapes. + Maps shapes to the visualization categories based in ShapefileCategory.Expression. - \see FillType, FillBgColor, FillBgTransparent. + The mapping between the category and shapes can be changed by Shapefile.set_ShapeCategory property. - + - Gets or sets the angle of rotation of the polygon fill in degrees. + The name of the classification scheme to display in the legend. - Affects the rotation of gradient and texture fill. - \see FillType - + - Gets or sets the transparency of the fill. Ranges from 0 (transparent) to 255 (opaque). + Removes all the categories from the list. - + - The type of the polygon fill. See the enumeration for details. + Returns the number of the categories in the list. - + - Gets or sets the value which indicates whether the fill is visible. + Restores the state of the object from the string. - Affects the drawing of point symbols and polygon shapes. + A string generated by ShapefileCategories.Serialize() method. - + - The name of the font to use for drawing point symbols when ShapeDrawingOptions.PointType is equal to pstCharacter. + Generates visualization categories by certain attribute + The index of the field to generate categories by. + The type of classification. + Number of classes to generate. The parameter is omitted + in case unique values classification is used. + True on successful generation and false otherwise. - + - Retrieves the numeric code of the last error that took place in the instance class. + Gets or sets the callback object which is used to return to the client the information about progress and errors. - The usage of this property clears the error code. + An instance of the class which implements ICallback interface should be passed. + The class must be implemented by caller. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Gets or sets the line color of the shapes. + Creates a new visualization category and inserts it at specified position of the list. - Affects the drawing of all shape types. + The index to insert category at. + The name of the new category. + Reference to the new category or NULL reference on failure. - + - Gets or sets line pattern for rendering polyline shapefile. + A text string associated with the instance of the class. Any value can be stored by developer in this property. - + - Gets or sets the line style of the shapes. + Inserts a category at the specified index in the collection. - Affects the drawing of all shape types. + The index. + The category to be inserted. + True on success. + \new494 Added in version 4.9.4 - + - Gets or sets the transparency of lines. Ranges from 0 (transparent) to 255 (opaque). + Retrieves the numeric code of the last error that took place in the class. + The usage of this property clears the error code. - + - Gets or sets the value which indicates whether lines will be visible while drawing shapes. + Moves the specified category down the list by swapping it with the succeeding category. - This affects drawing of polylines, as well as the drawing of outline of points symbols and polygons. + The index of the category to move down. + True on success and false otherwise. - + - Gets or sets the width of the lines to draw shapes. + Moves the specified category up the list by swapping it with the preceding category. + The index of the category to move. + True on success and false otherwise. - + - Gets or sets the picture which will be used as texture brush (ShapeDrawingOptions.FillType = ftPicture) - or point symbol (ShapeDrawingOptions.PointType = ptSymbolPicture). + Removes the specified category. - The property affects the drawing of point symbols and polygons. + The index of the category to remove. + True on success and false otherwise. - + - Gets or sets the coefficient for scaling picture horizontally. + Saves the state of the object to the string. + A string with serialized state. - + - Gets or sets the coefficient for scaling picture vertically. + A reference to the parent shapefile. + NULL reference will be returned in case the categories aren't associated with a shapefile. - + - Get or sets the ANSI code of the text character to use as point symbol. + Gets the description of the specific error code. + The error code returned by ShapefileCategories.LastErrorCode + The string with the description - + - Gets or sets the rotation of the point symbol in degrees. + Returns the category with the specified index. + The index of the category to retrieve. + The reference to the category or NULL reference on failure. - + - Gets or sets the predefined shape for the point symbol. + Replaces the category with the specified index with the new one. - It is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. + The index of the category to replace. + The new category. - + - Gets or sets the number of sides for some of the predefined symbols such as regular, star or cross. - - This value is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. - - - - Gets or sets the side ratio for some of the predefined point symbols such as regular, star and cross. - - This value is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. - - - - Gets or sets the size of the point symbol including predefined symbols, characters and pictures. - - - - - Gets or sets the type of the point symbols. - - The possible values include predefined symbols, text characters and pictures. - - - - Gets or sets a string associated with the instance of class. Can store any information provided by developer. - - - - - Gets or set the value which indicates whether line pattern will be used to render polyline shapefile. - - This property won't be set to true unless line pattern with at least one line exists. - - - - Gets or sets the color of vertices for the shapes. - - \see VerticesVisible - - - - Gets or sets the value which indicates whether the fill for shape vertices will be drawn. - - \see VerticesVisible - - - - Gets or sets the size of the shapes's vertices - - - - - Gets or sets the type of shape vertices. - - - - - Gets or sets the value which indicates whether vertices of the shape will be visible. The default values is false. - - The visibility of point symbols for point shapefiles is not affected by this property. - - - - Gets or sets the values which indicates whether shapes will be visible. - - - - - Gets or sets a value indicating whether hot spot of icons should be position at the bottom center. - When set to false the hotspot will be at the center of icon. + Gets index of the specified category within a collection. + Category to find index for. + Index of category. \new491 Added in version 4.9.1 - + - Gets or sets type of frame to be displayed around point when ShapeDrawingOptions.PointShape is set to ptSymbolFontCharacter. + Gets index of category by its name. The comparison is case-sensitive. + Category name to find index for. + Index of category. \new491 Added in version 4.9.1 - + - Gets or sets a value indicating whether a frame will be drawn around point when ShapeDrawingOptions.PointShape is set to ptSymbolFontCharacter. + Applies specific coloring to polygon layer based on 2 rules: + - each polygon fill color must be different from the colors of all adjacent polygons; + - the minimum overall number of colors must be used. - \new491 Added in version 4.9.1 + Color scheme to take colors from. If the number of color breaks + is smaller than the number of polygon colors, interpolation with ColorScheme.GetGraduatedColor + method will be used. + The coloring assumptions used by the method correspond to the formulation of + Four color theorem. But simple greedy + algorithm used by the method usually employs somewhat more colors (5-6), + although provides much better performance than precise implementations. + + True on success. + \new492 Added in version 4.9.2 - + - Gets or sets a value indicating whether the category will be displayed only - for scale range specified by MinVisibleScale and MaxVisibleScale properties + Generates categories based on specified field. - \new493 Added in version 4.9.3 + Name of the field. + Type of the classification. + The number classes. + True on success. + \new494 Added in version 4.9.4 - + - Gets or sets maximum map scale at which the category is visible - when ShapeDrawingOptions.DynamicVisibility is set to true. + Adds the category to the collection. - \new493 Added in version 4.9.3 + The category. + \new494 Added in version 4.9.4 - + - Gets or sets minimum map scale at which the category is visible - when ShapeDrawingOptions.DynamicVisibility is set to true. + Gets or sets the index of classification that was used to generate categories. \new493 Added in version 4.9.3 - + - Represents a list of visualization categories which determine the appearance of the shapefile. + Represents a set of visualization options for shapefile layer. - Provides methods for: - - managing categories: ShapefileCategories.Add, ShapefileCategories.Insert(), ShapefileCategories.Remove, ShapefileCategories.Clear(); - - generation of categories based on the specified attribute: ShapefileCategories.Generate(); - - mapping of categories to particular shapes: ShapefileCategories.ApplyExpressions(); - - setting of common color scheme for the range of categories: ShapefileCategories.ApplyColorScheme(). - - accessing particular categories: ShapefileCategories.get_Item(). + The set of options is represented by instance of ShapeDrawingOptions class which can be accessed by ShapefileCategory.DrawingOptions, + while ShapefileCategory.Expression is used for mapping this options to particular shapes. - Here is a diagram for the ShapefileCategories class. + Here is a diagram for the ShapefileCategory class. \dot - digraph shapefilecategories_diagram { + digraph shapefilecategory_diagram { nodesep = 0.3; ranksep = 0.3; splines = ortho; @@ -8385,539 +8893,302 @@ cat [ label="ShapefileCategory" URL="\ref ShapefileCategory"]; node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; - lst [ label="ShapefileCategories" URL="\ref ShapefileCategories"]; sdo [ label="ShapeDrawingOptions" URL="\ref ShapeDrawingOptions"]; node [style = dashed, color = gray]; - sf [ label="Shapefile" URL="\ref Shapefile"]; + lst [ label="ShapefileCategories" URL="\ref ShapefileCategories"]; - edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] cat -> sdo [ URL="\ref ShapefileCategory.DrawingOptions", tooltip = "ShapefileCategory.DrawingOptions", headlabel = " 1"]; lst -> cat [ URL="\ref ShapefileCategories.get_Item()", tooltip = "ShapefileCategories.get_Item()", headlabel = " n"]; - sf -> lst [ URL="\ref Shapefile.Categories", tooltip = "Shapefile.Categories", headlabel = " 1"]; } - \enddot Graph description \new48 Added in version 4.8 - + - Creates a new visualization category, adds it to the list and returns its reference to the caller. + Gets or sets visualization options associated with the category. - It's the responsibility of the developer to map the new category to the - particular shape by either: - - specifying ShapefileCategory.Expression and calling ShapefileCategories.ApplyExpression(); - - by using Shapefile.set_ShapeCategory() property; - . - The name of the new category. It must not be unique. - The reference to the newly created category or NULL reference on failure. - + - Creates the specified number of visualization categories and expressions for them. + Gets or sets expression which defines shapes which belong to the category. - The method can be useful to override generation routine provided in ShapefileCategories.GenerateCategories() - which always generate categories covering the full range of values of the specified field. This method can - define the range of values explicitly, therefore certain values can be excluded from classification or on contrary - categories can be added for the values which aren't yet present in the table. - The index of the field to build classification by. - The type of the classification. - The number of categories to add. If ClassificationType equals ctUniqueValues this value will be skipped. - The minimal value of the field to include in the classification. - Th maximum value of the field to include in the classification. - True on successful adding and false otherwise. - + - Applies color scheme to the visualization categories. + Gets or sets the name of the category. The names must not be unique. - The method of interpolation. - Color scheme to take colors from. - + - Applies color scheme to the visualization categories. + Gets or sets maximum value of the value range the category covers. - The method of interpolation. - The color scheme to take colors from. - The element of the shape symbology to apply colors to. + The value is used when cvRange is set as ShapefileCategory.ValueType. + \new493 Added in version 4.9.3 - + - Applies color scheme to the visualization categories. + Gets or sets minimum value of the value range the category covers. - The method of interpolation. - The color scheme to take colors from. - The element of the shape symbology to apply colors to. - The index of the first category to apply colors to. - The index of the last category to apply colors to. + The value is used when either cvSingleValue, cvRange + is set for ShapefileCategory.ValueType. + \new493 Added in version 4.9.3 - + - Maps particular shapes to the category based on ShapefileCategory.Expression. + Gets or sets value type for the category. - The mapping between the category and shapes can be changed by Shapefile.set_ShapeCategory property. - The index of the category. + Depending on value type either ShapefileCategory.MinValue/ShapefileCategory.MaxValue properties + or ShapefileCategory.Expression are used in the calculation process. ShapefileCategories.Generate + method will set cvSingleValue for unique values classification and ctRange for any + interval classification. These values are faster to apply. However manual setting of + ShapefileCategory.Expression property will change it to cvExpression. + \new493 Added in version 4.9.3 - + - Maps shapes to the visualization categories based in ShapefileCategory.Expression. + Defines a part of shapefile color scheme and specifies how a certain region of a shapefile will be colored. - The mapping between the category and shapes can be changed by Shapefile.set_ShapeCategory property. + \deprecated in v. 4.8. Use ShapefileCategories, ShapefileCategory, ColorScheme classes instead. + \removed493 Removed in 4.9.3 - + - Removes all the categories from the list. + Gets or sets the caption of the shapefile color break. - + - Restores the state of the object from the string. + Gets or sets the color which will be used for drawing objects characterized by ShapefileColorBreak.EndValue. - A string generated by ShapefileCategories.Serialize() method. - + - Generates visualization categories by certain attribute + Gets or sets the value which represent the end of shapefile color break. - The index of the field to generate categories by. - The type of classification. - Number of classes to generate. The parameter is omitted - in case unique values classification is used. - True on successful generation and false otherwise. - + - Creates a new visualization category and inserts it at specified position of the list. + Gets or sets the color which will be used for drawing objects characterized by ShapefileColorBreak.StartValue. - The index to insert category at. - The name of the new category. - Reference to the new category or NULL reference on failure. - + - Inserts a category at the specified index in the collection. + Gets or sets the value which represent the start of shapefile color break. - The index. - The category to be inserted. - True on success. - \new494 Added in version 4.9.4 - + - Moves the specified category down the list by swapping it with the succeeding category. + Gets or sets a boolean value which indicates whether the objects defined by color break will be displayed. - The index of the category to move down. - True on success and false otherwise. - + - Moves the specified category up the list by swapping it with the preceding category. + A shapefile color scheme defines how a shapefile will be colored. - The index of the category to move. - True on success and false otherwise. + A shapefile color scheme consists of ShapefileColorBreak objects. + \deprecated in v. 4.8. Use ShapefileCategories, ShapefileCategory, ColorScheme instead. + \removed493 Removed in 4.9.3 - + - Removes the specified category. + Adds a color break to the color scheme. - The index of the category to remove. - True on success and false otherwise. + + - + - Saves the state of the object to the string. + Gets or sets the index in the attribute table the color scheme is associated with. - A string with serialized state. - + - Gets the description of the specific error code. + Gets or sets callback object to return the information about the errors. - The error code returned by ShapefileCategories.LastErrorCode - The string with the description + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Returns the category with the specified index. + Insert a color break in the specified position of the scheme. - The index of the category to retrieve. - The reference to the category or NULL reference on failure. + The position to insert color break at. + The color break to insert. + The actual position color break was inserted at. - + - Replaces the category with the specified index with the new one. + Gets or sets text string associated with the object. - The index of the category to replace. - The new category. - + - Gets index of the specified category within a collection. + Returns the code of the last error which took place inside this instance of class. - Category to find index for. - Index of category. - \new491 Added in version 4.9.1 - + - Gets index of category by its name. The comparison is case-sensitive. + Gets or sets the layer handle the color scheme is associated with. - Category name to find index for. - Index of category. - \new491 Added in version 4.9.1 - + - Applies specific coloring to polygon layer based on 2 rules: - - each polygon fill color must be different from the colors of all adjacent polygons; - - the minimum overall number of colors must be used. + Gets the number of color breaks in the color scheme. - Color scheme to take colors from. If the number of color breaks - is smaller than the number of polygon colors, interpolation with ColorScheme.GetGraduatedColor - method will be used. - The coloring assumptions used by the method correspond to the formulation of - Four color theorem. But simple greedy - algorithm used by the method usually employs somewhat more colors (5-6), - although provides much better performance than precise implementations. - - True on success. - \new492 Added in version 4.9.2 + The number of breaks. - + - Generates categories based on specified field. + Removes specific color break from the scheme. - Name of the field. - Type of the classification. - The number classes. - True on success. - \new494 Added in version 4.9.4 + The index of the break to remove. - + - Adds the category to the collection. + Gets a color break from the color scheme. - The category. - \new494 Added in version 4.9.4 + The index of the break. + The color break object or NULL reference on failure. - + - The name of the classification scheme to display in the legend. + Gets the description of the error code returned by ShapefileColorScheme.LastErrorCode. + The code of error. + The description of error. - + - Returns the number of the categories in the list. + Replaces a color break in the color scheme. + The index of color break to replace. + The reference to the new color break. - + - Gets or sets the callback object which is used to return to the client the information about progress and errors. + Represents a network built from the polyline shapefile. - An instance of the class which implements ICallback interface should be passed. - The class must be implemented by caller. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + A shape network is created from the shapes in a polyline shapefile which allows you to traverse the shapefile simulating + water flowing in a watershed to a single outlet. To create a shape network from a polyline shapefile, first choose an outlet + shape from the shapes in the shapefile. Next, choose an outlet point within the specified outlet shape. Finally, you need to + select a tolerance value. The tolerance is used to determine whether to include a shape in the shape network if it is not + connected to the network. Using this starting criteria, a shape network can be created from the polyline shapefile. + - + - A text string associated with the instance of the class. Any value can be stored by developer in this property. + Builds a shape network from the specified line shapefile using the shape index to determine which shape in the shapefile is + to be used as the outlet shape. + The shapefile to be used to create the shape network. + The index of the shape in the specified shapefile to be used as the outlet shape for the shape network + The point index of the point in the specified outlet shape to be used as the outlet point for the shape network. + The tolerance used to find disconnected segments to merge into the network. + The ambiguity resolution method used to resolve any ambiguity while building the shape network. + Distance to outlet is the only ambiguity resolution method implemented. + Optional. The ICallback object which will receive progress and error messages during the + creation of the shape network. + The success or failure of building the shape network. If a non-zero integer is returned, the + shape network build was successful. If a zero is returned, the shape network build was not + successful. - + - Retrieves the numeric code of the last error that took place in the class. + Closes the shape network. - The usage of this property clears the error code. + A boolean value representing the success or failure of closing the shape network. - + - A reference to the parent shapefile. + Gets the current shape object in the shape network. - NULL reference will be returned in case the categories aren't associated with a shapefile. - + - Gets or sets the index of classification that was used to generate categories. + Gets the index of the current shape in the shape network. - \new493 Added in version 4.9.3 - + - Represents a set of visualization options for shapefile layer. + Deletes a shape from the shape network. - - The set of options is represented by instance of ShapeDrawingOptions class which can be accessed by ShapefileCategory.DrawingOptions, - while ShapefileCategory.Expression is used for mapping this options to particular shapes. - - Here is a diagram for the ShapefileCategory class. - \dot - digraph shapefilecategory_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - cat [ label="ShapefileCategory" URL="\ref ShapefileCategory"]; - - node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; - sdo [ label="ShapeDrawingOptions" URL="\ref ShapeDrawingOptions"]; - - node [style = dashed, color = gray]; - lst [ label="ShapefileCategories" URL="\ref ShapefileCategories"]; - - edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - cat -> sdo [ URL="\ref ShapefileCategory.DrawingOptions", tooltip = "ShapefileCategory.DrawingOptions", headlabel = " 1"]; - lst -> cat [ URL="\ref ShapefileCategories.get_Item()", tooltip = "ShapefileCategories.get_Item()", headlabel = " n"]; - } - \enddot - Graph description - \new48 Added in version 4.8 + The index of the shape to be deleted from the shape network. + A boolean value representing the success or failure of deleting the shape from the shape network. - + - Gets or sets visualization options associated with the category. + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - + - Gets or sets expression which defines shapes which belong to the category. + The key may be used by the programmer to store any string data associated with the object. - + - Gets or sets the name of the category. The names must not be unique. + Retrieves the last error generated in the object. - + - Gets or sets maximum value of the value range the category covers. + Moves the current shape pointer down the network by one link. - The value is used when cvRange is set as ShapefileCategory.ValueType. - \new493 Added in version 4.9.3 + A boolean value representing the success or failure of moving the current shape pointer down the + shape network by one link. - + - Gets or sets minimum value of the value range the category covers. + Moves the current shape pointer to the shape specified by the shape index. - The value is used when either cvSingleValue, cvRange - is set for ShapefileCategory.ValueType. - \new493 Added in version 4.9.3 + The shape index of the shape in the network to move the current shape pointer to. + A boolean value representing the success or failure of moving the current shape pointer to the + specified shape. - + - Gets or sets value type for the category. + Moves the current shape pointer to the outlet shape in the shape network. - Depending on value type either ShapefileCategory.MinValue/ShapefileCategory.MaxValue properties - or ShapefileCategory.Expression are used in the calculation process. ShapefileCategories.Generate - method will set cvSingleValue for unique values classification and ctRange for any - interval classification. These values are faster to apply. However manual setting of - ShapefileCategory.Expression property will change it to cvExpression. - \new493 Added in version 4.9.3 + A boolean value representing the success or failure of moving the current shape pointer to the + outlet shape in the shape network. - + - Defines a part of shapefile color scheme and specifies how a certain region of a shapefile will be colored. + Moves the current shape pointer up the shape network, taking the specified path. - \deprecated in v. 4.8. Use ShapefileCategories, ShapefileCategory, ColorScheme classes instead. - \removed493 Removed in 4.9.3 + The index of the shape in the shape network to use as the upstream path. This is necessary + because a node may have more than one upstream path. + A boolean value representing the success or failure of moving the current shape pointer up in the + shape network. - + - Gets or sets the caption of the shapefile color break. + Gets the number of shapes in the shape network. - + - Gets or sets the color which will be used for drawing objects characterized by ShapefileColorBreak.EndValue. + Gets the number of upstream shapes in the network before the next fork. - + - Gets or sets the value which represent the end of shapefile color break. + Opens a shape network. + The shapefile object to open as a shape network. + Optional. ICallback object which will receive progress and error messages while the shape network is opened. + A boolean value representing the success or failure of opening the shape network - + - Gets or sets the color which will be used for drawing objects characterized by ShapefileColorBreak.StartValue. + Gets the index of the parent of the current shape. If the current shape is the outlet shape in the shape network, -1 will be returned. - + - Gets or sets the value which represent the start of shapefile color break. - - - - - Gets or sets a boolean value which indicates whether the objects defined by color break will be displayed. - - - - - A shapefile color scheme defines how a shapefile will be colored. - - A shapefile color scheme consists of ShapefileColorBreak objects. - \deprecated in v. 4.8. Use ShapefileCategories, ShapefileCategory, ColorScheme instead. - \removed493 Removed in 4.9.3 - - - - Adds a color break to the color scheme. - - - - - - - Insert a color break in the specified position of the scheme. - - The position to insert color break at. - The color break to insert. - The actual position color break was inserted at. - - - - Gets the number of color breaks in the color scheme. - - The number of breaks. - - - - Removes specific color break from the scheme. - - The index of the break to remove. - - - - Gets a color break from the color scheme. - - The index of the break. - The color break object or NULL reference on failure. - - - - Gets the description of the error code returned by ShapefileColorScheme.LastErrorCode. - - The code of error. - The description of error. - - - - Replaces a color break in the color scheme. - - The index of color break to replace. - The reference to the new color break. - - - - Gets or sets the index in the attribute table the color scheme is associated with. - - - - - Gets or sets callback object to return the information about the errors. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Gets or sets text string associated with the object. - - - - - Returns the code of the last error which took place inside this instance of class. - - - - - Gets or sets the layer handle the color scheme is associated with. - - - - - Represents a network built from the polyline shapefile. - - A shape network is created from the shapes in a polyline shapefile which allows you to traverse the shapefile simulating - water flowing in a watershed to a single outlet. To create a shape network from a polyline shapefile, first choose an outlet - shape from the shapes in the shapefile. Next, choose an outlet point within the specified outlet shape. Finally, you need to - select a tolerance value. The tolerance is used to determine whether to include a shape in the shape network if it is not - connected to the network. Using this starting criteria, a shape network can be created from the polyline shapefile. - - - - - Builds a shape network from the specified line shapefile using the shape index to determine which shape in the shapefile is - to be used as the outlet shape. - - The shapefile to be used to create the shape network. - The index of the shape in the specified shapefile to be used as the outlet shape for the shape network - The point index of the point in the specified outlet shape to be used as the outlet point for the shape network. - The tolerance used to find disconnected segments to merge into the network. - The ambiguity resolution method used to resolve any ambiguity while building the shape network. - Distance to outlet is the only ambiguity resolution method implemented. - Optional. The ICallback object which will receive progress and error messages during the - creation of the shape network. - The success or failure of building the shape network. If a non-zero integer is returned, the - shape network build was successful. If a zero is returned, the shape network build was not - successful. - - - - Closes the shape network. - - A boolean value representing the success or failure of closing the shape network. - - - - Deletes a shape from the shape network. - - The index of the shape to be deleted from the shape network. - A boolean value representing the success or failure of deleting the shape from the shape network. - - - - Moves the current shape pointer down the network by one link. - - A boolean value representing the success or failure of moving the current shape pointer down the - shape network by one link. - - - - Moves the current shape pointer to the shape specified by the shape index. - - The shape index of the shape in the network to move the current shape pointer to. - A boolean value representing the success or failure of moving the current shape pointer to the - specified shape. - - - - Moves the current shape pointer to the outlet shape in the shape network. - - A boolean value representing the success or failure of moving the current shape pointer to the - outlet shape in the shape network. - - - - Moves the current shape pointer up the shape network, taking the specified path. - - The index of the shape in the shape network to use as the upstream path. This is necessary - because a node may have more than one upstream path. - A boolean value representing the success or failure of moving the current shape pointer up in the - shape network. - - - - Opens a shape network. - - The shapefile object to open as a shape network. - Optional. ICallback object which will receive progress and error messages while the shape network is opened. - A boolean value representing the success or failure of opening the shape network - - - - Rasterizes the network into a D8 grid. + Rasterizes the network into a D8 grid. A boolean value representing whether the shape network bounds will be used as the only bounds for the D8 grid or not. @@ -8926,6 +9197,11 @@ Optional. The ICallback object which will receive progress and error messages when the grid is being created. Optional. The rasterized Grid representing the shape network. + + + Gets the shapefile used to create the network. + + Gets the shape index of an ambiguous shape in the shape network. @@ -8952,51 +9228,6 @@ The error code for which the error message is required. The error message description for the specified error code. - - - Gets the current shape object in the shape network. - - - - - Gets the index of the current shape in the shape network. - - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - - - - The key may be used by the programmer to store any string data associated with the object. - - - - - Retrieves the last error generated in the object. - - - - - Gets the number of shapes in the shape network. - - - - - Gets the number of upstream shapes in the network before the next fork. - - - - - Gets the index of the parent of the current shape. If the current shape is the outlet shape in the shape network, -1 will be returned. - - - - - Gets the shapefile used to create the network. - - @@ -9009,6 +9240,11 @@ True on successful calculation and false otherwise. \new48 Added in version 4.8 + + + Returns the common dialog filter containing all supported file extensions in string format. + + Closes the attribute table. @@ -9087,6 +9323,37 @@ is being replced by the new field. A boolean value representing the success or failure of replacing the specified field. + + + Gets whether or not the table is in editing mode. + + + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + The key may be used by the programmer to store any string data associated with the object. + + + + + Retrieves the last error generated in the object. + + + + + Gets the number of fields in the table. + + + + + Gets the number of rows in the table. + + Opens a .dbf table from file. @@ -9251,7 +9518,13 @@ The methods may be used for in-memory, when the content should be saved without switching to disk mode. \new490 Added in version 4.9.0 - + + + Gets a value indicating whether the table has any joined tables. + + \new490 Added in version 4.9.0 + + Joins external table to the current one. @@ -9291,6 +9564,12 @@ Client can handle this event by populating joinSource table parameter using filename, fieldList and options parameters. \new490 Added in version 4.9.0 + + + Gets number of joins for the table. + + \new490 Added in version 4.9.0 + Serializes the state of joins for table to be restored later with Table.Deserialize method. @@ -9379,6 +9658,12 @@ The string with names. \new494 Added in version 4.9.4 + + + Gets the filename of the DBF file if the table is bound to one. + + \new494 Added in version 4.9.4 + Gets the options of the join operation. @@ -9395,60 +9680,6 @@ True if the row is modified. \new494 Added in version 4.9.4 - - - Returns the common dialog filter containing all supported file extensions in string format. - - - - - Gets whether or not the table is in editing mode. - - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - The key may be used by the programmer to store any string data associated with the object. - - - - - Retrieves the last error generated in the object. - - - - - Gets the number of fields in the table. - - - - - Gets the number of rows in the table. - - - - - Gets a value indicating whether the table has any joined tables. - - \new490 Added in version 4.9.0 - - - - Gets number of joins for the table. - - \new490 Added in version 4.9.0 - - - - Gets the filename of the DBF file if the table is bound to one. - - \new494 Added in version 4.9.4 - Holds the list of tile providers associated with %Tiles class. @@ -9463,7 +9694,7 @@ Arbitrary name of provider. Url pattern for provider. The pattern may include the following varying components: {zoom}, {x}, {y}, {switch:n1,n2,n3}. For example, the following can be used to setup OpenStreetMap - as custom provider: "http://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png". + as custom provider: "https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png". Projection used by tile server. Projection must not necessarily match the map projection. MapWinGIS will try to do the transformation even if projection don't match, though these may lead to distortions and gaps between tiles. @@ -9477,6 +9708,11 @@ True in case cached tiles, both from RAM and disk, for custom providers should be removed as well. + + + Gets the number of providers in the list. + + Removes specified custom provider from the list. @@ -9577,6 +9813,17 @@ Index of the provider in the list. URL pattern for custom providers and empty string for default ones. + + + Gets or sets a Callback object which handles progress and error messages. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + Gets the code of last error which took place inside this object. + + Gets the description of the specific error code. @@ -9620,22 +9867,6 @@ The p value. \new494 Added in version 4.9.4 - - - Gets the number of providers in the list. - - - - - Gets or sets a Callback object which handles progress and error messages. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Gets the code of last error which took place inside this object. - - @@ -9665,12 +9896,25 @@ Minimal scale (zoom) to clear tiles for. Maximum scale (zoom) to clear tiles for. + + + Gets zoom (scale) of tiles currently displayed on the map. + + Tile zooms are discrete, but the scale for Map control is continuous. + Therefore in most cases tiles of particular zoom will be somewhat additionally scaled to fit the map, + i.e. their display size on map won't be equal to the original 256 pixels. + Restores the state of Tiles class from string. Serialized string generated by Tiles.Serialize method. + + + Gets or sets the filename of SQLite database to cache tiles into. + + Gets the bounds of specific tile in decimal degrees (for inner use/debug purposes). @@ -9691,6 +9935,23 @@ Extents object with tile bounds or null on failure. Can be used at the first step of prefetching operation. + + + Gets or sets a value indicating whether a grid should be drawn to displayes borders of tiles (for debug purposes). + + + + + Gets or sets the maximum zoom (scale) to be cached if the automatic caching is chosen. + + The setting won't affect tile prefetching. + + + + Gets or sets the minimum zoom (scale) to be cached if the automatic caching is chosen. + + The setting won't affect tile prefetching. + Caches tiles of the specified provider within specified geographic bounds @@ -9738,6 +9999,33 @@ to handle such extensions. The operation is executed asynchronously. See details in Tiles.Prefetch. + + + Gets or sets active provider to serve the tiles. + + The property will return ProviderCustom for custom provider and + won't be able to set a custom provider (use Tiles.ProviderId to do it). + + + + Gets or sets active provider to server the tiles. Ids of both default and custom providers can be specified. + + + + + Gets the name of the active provider. + + + + + Gets list of the available default and custom tile providers. + + + + + Gets proxy server settings for tiles class including IP and port, e.g. 192.168.0.1:80. + + Serializes the state of the Tiles class to be restored later with Tiles.Deserialize method. @@ -9752,6 +10040,25 @@ Port to be used. True on success and false otherwise. + + + Gets or sets the amount of time in milliseconds a worker thread will sleep before the next HTTP request. + + In some cases rapid caching of tiles can enact certain blocking logic for the IP address by server or one of the proxies. + \new491 Added in version 4.9.1 + + + + Gets or sets a value indicating whether server requests will be made to get the tiles. + + When set to false tiles will only be loaded from cache. + + + + Gets or sets a value indicating whether the tiles will be displayed on the map. + + When set to false tiles won't be requested either from server or cache. + Gets the current size of cache. @@ -9810,6 +10117,24 @@ The type of cache. True if the specific type of cache can be used. + + + Gets or sets a value indicating whether log will include all HTTP requests or only unsuccessful ones. + + \new491 Added in version 4.9.1 + + + + Gets filename to write log into. + + \new491 Added in version 4.9.1 + + + + Gets a value indicating whether logging of HTTP requests will be performed. + + \new491 Added in version 4.9.1 + Starts logging HTTP requests for tile server. @@ -9825,6 +10150,18 @@ \new491 Added in version 4.9.1 + + + Gets the number of unsuccessful HTTP requests during prefetching operation (Tiles.Prefetch and overloads). + + \new491 Added in version 4.9.1 + + + + Gets the total number of requests carried out during prefetching operation. + + \new491 Added in version 4.9.1 + Clears information about prefetching errors. @@ -9843,6 +10180,22 @@ Max Y index of tile. Number of tiles. + + + Gets or sets a Callback object which handles progress and error messages. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + A text string associated with object. Any value can be stored by developer in this property. + + + + + Gets the code of last error which took place inside this object. + + Gets the description of the specific error code. @@ -9850,6 +10203,31 @@ The error code returned by LastErrorCode property. String with the description. + + + Gets maximum available zoom level for the current provider. + + \new491 Added in version 4.9.1 + + + + Gets minimum available zoom level for the current provider. + + \new491 Added in version 4.9.1 + + + + Get information about whether map projection and tile projection match. + + This diagnostic value indicates whether tiles will be rendered without scaling and distortions and if they will be rendered at all. + \new491 Added in version 4.9.1 + + + + Gets projection used by specific tile service. + + \new491 Added in version 4.9.1 + Clears user name and password set by Tiles.SetProxyAuthorization method. @@ -9868,158 +10246,16 @@ True on success. \new493 Added in version 4.9.3 - + - Gets zoom (scale) of tiles currently displayed on the map. + Represents a triangulated irregular network which may be displayed in the map. - Tile zooms are discrete, but the scale for Map control is continuous. - Therefore in most cases tiles of particular zoom will be somewhat additionally scaled to fit the map, - i.e. their display size on map won't be equal to the original 256 pixels. - - - - Gets or sets the filename of SQLite database to cache tiles into. - - - - - Gets or sets a value indicating whether a grid should be drawn to displayes borders of tiles (for debug purposes). - - - - - Gets or sets the maximum zoom (scale) to be cached if the automatic caching is chosen. - - The setting won't affect tile prefetching. - - - - Gets or sets the minimum zoom (scale) to be cached if the automatic caching is chosen. - - The setting won't affect tile prefetching. - - - - Gets or sets active provider to serve the tiles. - - The property will return ProviderCustom for custom provider and - won't be able to set a custom provider (use Tiles.ProviderId to do it). - - - - Gets or sets active provider to server the tiles. Ids of both default and custom providers can be specified. - - - - - Gets the name of the active provider. - - - - - Gets list of the available default and custom tile providers. - - - - - Gets proxy server settings for tiles class including IP and port, e.g. 192.168.0.1:80. - - - - - Gets or sets the amount of time in milliseconds a worker thread will sleep before the next HTTP request. - - In some cases rapid caching of tiles can enact certain blocking logic for the IP address by server or one of the proxies. - \new491 Added in version 4.9.1 - - - - Gets or sets a value indicating whether server requests will be made to get the tiles. - - When set to false tiles will only be loaded from cache. - - - - Gets or sets a value indicating whether the tiles will be displayed on the map. - - When set to false tiles won't be requested either from server or cache. - - - - Gets or sets a value indicating whether log will include all HTTP requests or only unsuccessful ones. - - \new491 Added in version 4.9.1 - - - - Gets filename to write log into. - - \new491 Added in version 4.9.1 - - - - Gets a value indicating whether logging of HTTP requests will be performed. - - \new491 Added in version 4.9.1 - - - - Gets the number of unsuccessful HTTP requests during prefetching operation (Tiles.Prefetch and overloads). - - \new491 Added in version 4.9.1 - - - - Gets the total number of requests carried out during prefetching operation. - - \new491 Added in version 4.9.1 - - - - Gets or sets a Callback object which handles progress and error messages. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - A text string associated with object. Any value can be stored by developer in this property. - - - - - Gets the code of last error which took place inside this object. - - - - - Gets maximum available zoom level for the current provider. - - \new491 Added in version 4.9.1 - - - - Gets minimum available zoom level for the current provider. - - \new491 Added in version 4.9.1 - - - - Get information about whether map projection and tile projection match. - - This diagnostic value indicates whether tiles will be rendered without scaling and distortions and if they will be rendered at all. - \new491 Added in version 4.9.1 - - - - Gets projection used by specific tile service. - - \new491 Added in version 4.9.1 + A tin may be created from a grid, or opened from file. - + - Represents a triangulated irregular network which may be displayed in the map. + The string for common open dialog for filtering files which may be used as a source for TIN (*.tin). - A tin may be created from a grid, or opened from file. @@ -10050,6 +10286,21 @@ An array of Point type. True on success and false otherwise. + + + The filename associated with the object. + + + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + + + + The key may be used by the programmer to store any string data associated with the object. + + Gets the maximum x, y, and z values of the TIN's extents. @@ -10066,6 +10317,16 @@ Returns the minimum y value of the TIN's extents Returns the minimum Z value of the TIN's extents. + + + Returns the number of the triangles in the TIN. + + + + + Returns the number of the vertices in the TIN. + + Opens a TIN from the specified file. @@ -10137,36 +10398,6 @@ The index of the triangle to be tested whether or not it is a no-data triangle. A boolean value representing whether or not the triangle is a no-data triangle. - - - The string for common open dialog for filtering files which may be used as a source for TIN (*.tin). - - - - - The filename associated with the object. - - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - - - - The key may be used by the programmer to store any string data associated with the object. - - - - - Returns the number of the triangles in the TIN. - - - - - Returns the number of the vertices in the TIN. - - Holds list of actions performed by user with interactive editing tools to enable undo functionality. @@ -10207,27 +10438,6 @@ Returns number of operation in the batch. - - - Gets the description of the specific error code. - - The error code returned by LastErrorCode property. - String with the description. - - - - Reapplies a single operation in the list that was previously undone. - - If true, zooms to the subject shape in case it's outside the current map view. - True on success, i.e. there was at least one operation to redo. - - - - Reverts a single operation performed by user. - - If true, zooms to the subject shape in case it's outside the current map view. - True on success, i.e. there was at least one operation to undo - A text string associated with object. Any value can be stored by developer in this property. @@ -10254,6 +10464,27 @@ Number of operations performed by user that can be reverted with UndoList.Undo method. + + + Gets the description of the specific error code. + + The error code returned by LastErrorCode property. + String with the description. + + + + Reapplies a single operation in the list that was previously undone. + + If true, zooms to the subject shape in case it's outside the current map view. + True on success, i.e. there was at least one operation to redo. + + + + Reverts a single operation performed by user. + + If true, zooms to the subject shape in case it's outside the current map view. + True on success, i.e. there was at least one operation to undo + A utils object provides access to a set of utility functions to perform a variety of tasks on other objects such as grids, images, points, shapes, shapefiles, tins, etc. @@ -10292,6 +10523,12 @@ Altitude. Defaults to 45. + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + Uses valid data in a grid to replace grid cells containing no-data values with an interpolated value. @@ -10346,11 +10583,21 @@ the grid is being converted to the shapefile. - + - Merges several images in a single image. + The key may be used by the programmer to store any string data associated with the object. - All the input images must be of the same size. + + + + Retrieves the last error generated in the object. + + + + + Merges several images in a single image. + + All the input images must be of the same size. The color marked in the input image as transparent won't be passed to the output. An array of string type with the filenames of the images. The name if te output file. @@ -10812,21 +11059,77 @@ True on success and false otherwise. \new493 Added in version 4.9.3 (is moved from AxMap.IsTiffGrid) - + - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + Gets the tkUnitsOfMeasure enumeration associated with the specified EPSG Unit Code - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + EPSG-defined Unit of Measure constant + The internal enumeration associated with the specified EPSG code + + Supports the more common EPSG-defined Unit constants; specifically those that can be mapped to + the currently defined tkUnitsOfMeasure enumeration values. If the EPSG code cannot be mapped, + an Error will be submitted to the global callback with error code tkINVALID_PARAMETER_VALUE, + and return the default value of umDecimalDegrees. + + \new495 Added in version 4.9.5 - + - The key may be used by the programmer to store any string data associated with the object. + Gets the name of the projection associated with the specified NAD83 enumeration + + Value from the the NAD83 projection enumeration tkNad83Projection + + GDAL-provided projection name, or an empty string on error + + If an error occurs, either because an invalid ID is specified, or the projection string + could not be loaded, a descriptive error will be raised to the Callback function (if one is specified). + + \new495 Added in version 4.9.5 - + - Retrieves the last error generated in the object. + Gets the name of the projection associated with the specified WGS84 enumeration + + + Value from the the NAD83 projection enumeration tkNad83Projection + + GDAL-provided projection name, or an empty string on error + + If an error occurs, either because an invalid ID is specified, or the projection string + could not be loaded, a descriptive error will be raised to the Callback function (if one is specified). + + \new495 Added in version 4.9.5 + + + + Gets the name of the projected coordinate system associated with the specified SRID, + which include the NAD83 and WGS84 codes, as well as those not specified by the enumerations, + such as NAD27, NAD83 Harn, Beijing, Pulkova, etc. + + + Spatial Reference identifier, could refer to any valid Projected or Geographic coordinate system + + GDAL-provided name of a projected or geographic coordinate system, or an empty string on error + + If an error occurs, either because an invalid ID is specified, or the projection string + could not be loaded, a descriptive error will be raised to the Callback function (if one is specified). + + \new495 Added in version 4.9.5 + + + + Gets a list of ID,Name pairs of Projected and/or Geographic coordinate systems + One or a combination of values from the tkProjectionSet enumeration + Reference to an Object that will be filled with an array of strings + True if successful (list will contain an array of strings containing the ID/Name pairs associated with the specified Projection Sets), or False on failure (list will be empty) + + Each string will contain one pair of values, an ID and a Name, separated by a comma (e.g. "32611,WGS 84 / UTM zone 11N"). + These can be parsed and used, for example, to populate a ComboBox control for user selection of a Projection. + If an error occurs, or if the projection strings could not be loaded, a descriptive error will be raised to the Callback function (if one is specified). + + \new495 Added in version 4.9.5 @@ -10847,18 +11150,6 @@ The vector to use to calculate the dot product with the current vector object. The dot product of the current vector object and the specified vector. - - - Normalizes the vector. - - - - - Retrieves the error message associated with the specified error code. - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. @@ -10875,6 +11166,18 @@ Retrieves the last error generated in the object. + + + Normalizes the vector. + + + + + Retrieves the error message associated with the specified error code. + + + + Gets or sets the i component of the vector. @@ -10890,12 +11193,6 @@ Gets or sets the k component of the vector. - - - List of known extents (mostly countries of the world) - - \new491 Added in version 4.9.1 - @@ -11077,16 +11374,6 @@ The error code returned by LastErrorCode property. String with the description. - - - - Gets metadata item with specified index associated with current driver. - - Index of metadata item to be returned. - String with metadata. - - - Gets code of the last error which took place inside this object. @@ -11113,11 +11400,21 @@ Gets name driver (name of format) for this datasource. + Gets the number of metadata items associated with current driver. + + + Gets metadata item with specified index associated with current driver. + + Index of metadata item to be returned. + String with metadata. + + + Extracts the last error message reported by GDAL library. @@ -11814,6 +12111,27 @@ \deprecated v4.8. Use properties which take tkDefaultPointSymbol enumeration as input instead. + + + Available options applicable to point reflection + + \new495 Added in version 4.9.5 + + + + No reflection is applied + + + + + Symbol is flipped left-to-right + + + + + Symbol is flipped top-to-bottom + + The available parameters for the projections. @@ -13153,6 +13471,12 @@ Possible values of pixel offset mode (GDI+ rendering). + + + Supports the load of subsets of Projection Strings from Utils.GetProjectionStrings. + Can be combined to get NAD83 and/or WGS84, or the entire set. + + A strongly-typed resource class, for looking up localized strings, etc. @@ -13224,6 +13548,35 @@ \dotfile shapefilegroups.dot Graph description\n\n + + + Gets or sets an instance of ShapefileCategories class associated with the shapefile. + + The property can't be set to NULL (there is always an instance ShapefileCategories class associated with the Shapefile). + \new48 Added in version 4.8 + + + + Gets expression to be set for OpenFileDialog.Filter property to select ESRI shapefiles. + + + + + Gets or sets collision mode for point symbols for point and multi-point shapefiles. + + See tkCollisionMode enumeration. + \new48 Added in version 4.8 + + + + Gets or sets an instance of ShapeDrawingOptions class which holds default drawing options. + + + Default options are applied to every shape, which doesn't belong to a shapefile category. + The property can't be set to NULL (there is always an instance ShapeDrawingOptions class associated with shapefile). + + \new48 Added in version 4.8 + Restores the state of shapefile from the string. @@ -13243,6 +13596,26 @@ Use Shapefile.ErrorMsg(Shapefile.LastErrorCode) to find out the reason of failure. \new48 Added in version 4.8 + + + Gets bounding box which encompass all the shapes in the shapefile. + + When fast mode is set on, Shapefile.RefreshExtents call is needed to get the correct + extents after edits where made. + + + + Returns the handle of the shapefile. For inner use only. + + + + + Gets the name of the file which is used as a source for this instance of Shapefile class. + + + The property should be used for disk-based shapefiles only (see Shapefile.SourceType property). + + Generates labels for the shapefile based on values of the specified attribute. @@ -13255,6 +13628,87 @@ Labels of the multi-part shape are treated like a single label. \new48 Added in version 4.8 + + + Gets or sets the instance of the Labels class associated with the shapefile. + + The property can't be set to NULL (there is always an instance Labels class associated with shapefile). + \new48 Added in version 4.8 + + + + Gets or sets an instance of Charts class associated with the shapefile. + + The property can't be set to NULL (there is always an instance of Charts class associated with shapefile). + \new48 Added in version 4.8 + + + + Get or sets an instance of GeoProjection class associated with the shapefile. + + The property can't be set to NULL (there is always an instance of GeoProjection class associated with the shapefile). + \new48 Added in version 4.8 + + + + Gets or sets a Callback object which handles progress and error messages of the Shapefile class. + + + It's recommended to set it in case time consuming operation will be used (geoprocessing, generation of labels, etc). + The property is equal to NULL by default. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + Sets an object which implements IStopExecution interface and facilitates stopping of the + geoprocessing operations. + + \new48 Added in version 4.8 + + + + A text string associated with the shapefile. Any value can be stored by developer in this property. + + + + + Gets the code of last error which took place inside this object. + + + To retrieve text description of error, use Shapefile.get_ErrorMsg(Shapefile.LastErrorCode). + Check this value if a certain method has failed. + + + + Gets the number of shapes in the shapefile. + + + + + Gets or sets the projection string for shapefile. String in proj4 and ESRI WKT formats are supported. + + \deprecated v 4.8 Use Shapefile.GeoProjection property instead. + + + + Gets the type of the shapefile. + + It is not possible to change the type of the shapefile without closing it. + + + + Gets the value which indicate the type the data used by shapefile object. + + See details in the description of tkShapefileSourceType enumeration. + \new48 Added in version 4.8 + + + + Gets or sets the expression which defines shapes to be visible on the map. + + In case of empty or invalid string all the shapes will be visible. + \new48 Added in version 4.8 + Gets the description of the specific error code. @@ -13325,6 +13779,12 @@ The index of shape to retrieve. The reference to the shape or NULL reference on invalid index. + + + Gets "flattened" shapefile type, i.e. Z and M components will be ignored. + + \new493 Added in version 4.9.3 + Gets rotation angle for a shape. @@ -13386,6 +13846,13 @@ Value indicating whether the shape is hidden. \new493 Added in version 4.9.3 + + + Gets or sets a value indicating whether this shapefile will be visible to cmIdentify tool. + + \see AxMap.CursorMode + \new493 Added in version 4.9.3 + Moves shapefile at specified offset. @@ -13420,6 +13887,13 @@ True on success \new494 Added in version 4.9.4 + + + Gets a value indicating whether shapefile is in append mode. + Any shapes added with Shapefile.EditAddShape will be immediately written to the disk. + + \new494 Added in version 4.9.4 + The sorting of the shapefile will be reapplied before next redraw after calling this method. @@ -13435,7 +13909,20 @@ True if the operations was successful. \new494 Added in version 4.9.4 - + + + The name of the field to be used to determine the drawing order of point shapes and labels. + + \new494 Added in version 4.9.4 + + + + Gets or sets a value indicating whether shapes will be sorted in ascending order. + + \see SortField + \new494 Added in version 4.9.4 + + Gets a specific field stored in the attribute table. @@ -13478,6 +13965,22 @@ It's recommended to pass NULL and use Shapefile.GlobalCallback property instead. True on success and false otherwise. + + + Gets the value indicating whether editing operations are allowed for shapefile attribute table. + + Use Shapefile.StartEditingTable and Shapefile.StopEditingTable to control editing mode. + + + + Gets the number of fields in attribute table of the shapefile. + + + + + Gets the reference to the attribute table associated with the shapefile. + + Opens editing mode for the attribute table. @@ -13512,6 +14015,22 @@ \new493 Added in version 4.9.3 + \addtogroup shapefile_editing Shapefile editing + Here is a list of properties and methods which control the editing of shapefile. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_editing { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Editing" URL="\ref shapefile_editing"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Deletes all the shapes from the shapefile. @@ -13542,6 +14061,13 @@ An invalid index will be automatically substituted with closest allowable value without reporting the error. True on success and false otherwise. + + + Gets the value indicating whether editing operations are allowed for shapefile. + + Shapefile.EditInsertShape, Shapefile.EditDeleteShape, Shapefile.EditClear are affected by this property. + \n Use Shapefile.StartEditingShapes and Shapefile.StopEditingShapes to control the editing mode. + Starts editing mode for the shapefile. @@ -13605,7 +14131,51 @@ True on success. \new493 Added in version 4.9.3 + + + Gets or sets a value indicating whether shapefile can be redrawn without redrawing other layer on the map. + + + All volatile shapefiles will be placed in main screen buffer (along with drawing layers) rather than data layer buffer, + so that their redraw can be forced with AxMap.Redraw2(tkRedrawType.RedrawSkipDataLayers). This can be recommended + for in-memory shapefiles with constantly changing values to ensure rendering performance. + + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether a shapefile can be edited with built-in interactive tools. + + Setting the property to true will automatically call Shapefile.StartEditingShapes if + shapefile hasn't been loaded in the memory already. Setting it false won't call Shapefile.StopEditingShapes, + only interactive tools will be disabled. + Interactive editing mode automatically sets Shapefile.Volatile property to true. + \see ShapeEditor, AxMap.CursorMode + \new493 Added in version 4.9.3 + + + + Gets or sets a value indicating whether interactive editing tools can snap to vertices of the shapefile. + + \new493 Added in version 4.9.3 + + \addtogroup shapefile_geoprocessing Shapefile geoprocessing + Here is a list of methods to perform geoprocessing tasks using shapefile data. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_geoprocessing { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Geoprocessing" URL="\ref shapefile_geoprocessing"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Creates a new shapefile by creating multi-part shapes from shapes with the same value of specified attribute. @@ -13676,706 +14246,324 @@ A value which indicates whether overlapping buffered shapes will be merged into a single shapes. A reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Clips current shapefile by the definition shapefile. - - A value which indicates whether all or only selected shape of this shapefile - will be treated as input. - The definition shapefile. - A value which indicates whether all or only selected shape of the definition shapefile - will be treated as input. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Calculates difference of 2 shapefiles. - - A value which indicates whether all or only selected shape of this shapefile - will be treated as input. - The overlay shapefile. - A value which indicates whether all or only selected shape of the overlay shapefile - will be treated as input. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Merges shapes of the input shapefile based on specified attribute. - - All shapes with the same value of the attribute will be merged in a single shape. - If the shapes aren't adjacent, then multi-part shape will be created. - An index of field from attribute table of the shapefile to dissolve by. - A boolean value which indicates whether all or only selected shapes will be processed. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Creates a new instance of shapefile class with single-part shapes produced from the - multi-part shapes of the input shapefile. - Single-part input shapes are moved to the output shapefile - without changes. Attribute values are copied to the output shapefile without changes. - A value which indicates whether the operation will be applied to the selected shapes only. - A new instance of Shapefile class with resultant shapes or NULL reference on failure. - \new48 Added in version 4.8 - - - - Creates a new instance of the shapefile class and copies selected shapes of the input shapefile to it. - - A new instance of shapefile class with selected shapes or NULL reference on failure. - \new48 Added in version 4.8 - - - - Creates a new shapefile by fixing invalid shapes of the input shapefile. - - The output shapefile. - True on successful fixing of all shapes and false if at least one shapes wasn't fixed. - \new48 Added in version 4.8 - - - - Calculates intersection of 2 input shapefiles. - - Intersection can generate shapes of different types. For example, the intersection of 2 polygons can be - a polygon, a polyline, a point or any combination of those. With SHP_NULLSHAPE fileType parameter the most obvious type will be used: - for example SHP_POLYGON for 2 polygon shapefiles. - A value which indicates whether operation will be applied to the selected shapes of the current shapefile only. - The second shapefile to perfrom intersection. - A value which indicates whether operation will be applied to the selected shapes of the second shapefile only. - The type of output shapefiles. SHP_NULLSHAPE value should be passed for automatic choosing of type. - An instance of class implementing ICallback interface. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Creates a new instance of shapefile class which holds shapes from 2 input shapefiles. - - - Both shapefiles must have the same ShpfileType. No changes to geometry of individual shapes are made. - Attribute values of both input shapefile will be passed to the resulting one. - - The value which indicates whether the operation will be applied - only to the selected shapes of the first shapefile. - The second shapefile to take shapes from. - A value which Indicates whether the operation will be applied - only to the selected shapes of the second shapefile - Reference to the output shapefile or NULL reference on failure - \new48 Added in version 4.8 - - - - Creates a new shapefile by re-projecting the current one. - - The projection of the output shapefile. - The output value with the number of shapes successfully reprojected. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Reprojects shapes of the current shapefile. - - The new projection. - The number of shapes successfully reprojected. - Returns true on success and false otherwise. - \new48 Added in version 4.8 - - - - aka SpatialQuery. Returns an array with indices of shapes of the current shapefile which - are in the specified relation to the definition shapefile. - - The definition shapefile. - The target relation between shapes of the 2 shapefiles. - The value which indicates whether only selected shapes of the definition shapefile will be used. - The resulting array of long data type with shape indices. - A callback object for passing to the client - the information about the progress and errors. - True in case at least one shape was selected and false otherwise. - \new48 Added in version 4.8 - - - - Creates a new shapefile by removing excessive vertices from the current shapefile - - Applicable to the polyline or polygon shapefiles only. - The initial shapefile remains intact. Attribute values are copied to the output shapefile without changes. - The minimal distance between 2 succeeding points. A succeeding point lying closer than - this value, will be removed. - A value which indicates whether all or only selected shapes will be processed. - A reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Sorts shapes in the shapefile based on the specified attribute. - - The index of field to set the sorting order. - A value which defines the sorting order. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Calculates symmetrical difference of the 2 shapefiles. - - The operation consists of 2 mirror-like Difference operations. - Attribute values of both shapefiles are passed to the output one without changes. - Both input shapefiles remain intact. - A value which indicates that only selected shapes of the first shapefile will be processed. - The second shapefile. - A value which indicates that only selected shapes of the second shapefile will be processed. - A reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Calculates union of 2 shapefiles. - - The operation consists of intersection operation and 2 mirror-like difference operations. - The value which indicates that only selected shapes of the first shapefile will be processed. - The second shapefile. - The value which indicates that only selected shapes of the second shapefile will be processed. - A reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Splits polylines at intersection with any other polylines. Works for polyline shapefile only. - - Resulting shapefile or null if the operation wasn't successful. - \new490 Added in version 4.9.0 - - - - Clears GEOS geometries cached during certain geoprocessing tasks. - - Shapefile.GetRelatedShapes currently is the only method that uses such caching - to improve performance if search is performed multiple times for different shapes. - \new491 Added in version 4.9.1 - - - - Loads data into in-memory shapefile from the specified shapefile on the disk. - - Filename of the shapefile to load from. - Callback interface. - True on success and false otherwise. - The shapefile object with remain in in-memory state. - \new491 Added in version 4.9.1 - - - - Writes the contents of the shapefile to specified file. - - Filename to write shapefile data to. - Callback interface. - True on success and false otherwise. - The state of shapefile won't be affected, i.e. in-memory shapefile will remain in-memory one. - \new491 Added in version 4.9.1 - - - Creates a copy of the shapefile. - Output shapefile will have the same type, projection and fields of the attribute table, - while shapes and the records of the attribute table aren't copied. - For complete copy of the shapefile use Shapefile.SelectAll() and Shapefile.ExportSelection(). - \new48 Added in version 4.8 - - - - Closes shapefile and releases all the resources. - - In case shapefile is in editing mode (Shapefile.EditingShapes = true) - all the edits will be discarded. - This value should not be analysed. - - - - - Initializes in-memory shapefile of the specified type with unique index field. - - MWShapeID field will be added to the attribute table. An increasing unique positive integer value - will be set in this field for each shape added to the shapefile. The field with MWShapeID name - created manually will be treated in the same way. - The name of the new shapefile. An empty string should be passed here. - Type of the shapefile to create. - Returns true on success and false otherwise. - - - - Opens shapefile from the disk. - - Any other shapefile currently opened will be closed without saving the changes. - Shapefile.SourceType property will be set to sstDiskBased. - The name of the file to open (.shp extension). - A callback object to report errors and progress information. - True on success and false otherwise. - Use Shapefile.get_ErrorMsg(Shapefile.LastErrorCode) to find out the reason of failure. - - - - Changes file associated with the current instance of the shapefile class. - - It is equivalent to consequent calling of Shapefile.Close and Shapefile.Open. - The filename of the new shapefile to be opened. - True on successful opening of the new shapefile or false otherwise. - - - - Saves edits of the in-memory shapefile to the disk without closing editing mode. - - Applicable only when Shapefile.EditingShapes = true. - A callback object to report errors and progress information. - True on successful saving and false otherwise. - - - - Saves in-memory shapefile to the disk. - - The name of the file to save data in. - A callback object to report errors and progress information. - True on successful saving and false otherwise. - - - - Saves shapefile to the disk. - - The new filename. - If set to true the editing for shapefile will be stopped. - If set to true the file will not be assigned as a source of this instance. - True on success. - \new494 Added in version 4.9.4 - - - - Caches the coordinates of shapefile points for faster point in shape test. - - Shapefile.EndPointInShapefile call is needed to release the memory. - True on successful caching and false otherwise. - - - - Clears the cached data allocated by Shapefile.BeginPointInShapefile. - - - - - Returns boolean value which indicates whether the given point is located within the specified shape. - - The operation is applicable for polygon shapefiles only. - The index shape (polygon) to perform the test. - X coordinate of the point. - Y coordinate of the point. - True in case the point is located within polygon and false otherwise. - - - - Returns a number which indicates the index of shapes within which a test point is situated. - - Call Shapefile.BeginPointInShapefile to improve performance. - The x coordinate of the point. - The y coordinate of the point. - The index of shape. - - - - Returns the number of points in the specified shape of the shapefile. - - This property is more efficient than calling Shapefile.get_Shape().NumPoints. - The index of the shape. - The number of points or -1 in case of invalid index. - There is a confusion with name casing for this property. - It's actually spelled 'get_NumPoints' in the source code. - However because of the known bug in PIA generation process the property - ended up spelled 'get_numPoints' in earlier version of PIAs. After some hesitation we decided to keep it that way. - See description of the bug here: http://stackoverflow.com/questions/3179676/c-exposed-property-for-com-in-idl-is-showing-as-lower-case-all-of-a-sudden - - - - Returns the extents of the shape with the given index. - - This operation is faster than Shapefile.get_Shape().Extents as there is no need to read all the shape data. - The index of the shape. - The extents of shape or NULL reference on failure. - - - - Returns the specified point of shape. - - This operation doesn't require the reading of all shape date from disk, therefore - it will be faster when editing mode is false. - The index of shape. - The point index. - The point or the NULL reference on the invalid index. - - - - Returns an array with the coordinates of points of the specified shape. - - The value specified in numPoints will be adjusted if the specified number is greater than the number of points. - The index of shape. - The number of point to return. - The array of double type with coordinates of the point. - Every two elements represent x and y coordinate of the point respectively. - - - - Refreshes extents of all shapes in the shapefile. - - See Shapefile.CacheExtents for the details. - The value can be omitted. - \new48 Added in version 4.8 - - - - Refreshes the extents of the particular shape in the shapefile. - - See Shapefile.CacheExtents for the details. - The index of the shape which extents are to be refreshed. - True on success and false in case of invalid shape index. - \new48 Added in version 4.8 - - - - Gets the vertex closest to the specified point. - - X coordinate of the point to search from. - Y coordinate of the point to search from. - Maximum distance to search. Use 0 to search at any distance. Passing the max distance can improve performance. - Index of shape to which closest vertex belongs. - Index of closest vertex within shape. - The distance to the closest vertex. - True if the vertex was found within specified distance and false otherwise. - \new490 Added in version 4.9.0 - - - - Gets shapes which are located at specified spatial relation to reference shape. - - Index of reference shape. - Spatial relation. Isn't implemented for Disjoint. - The array of indices of the found shapes (int[]) - True if at least one related shape was found. - \new490 Added in version 4.9.0 - - - - Gets shapes which are located at specified spatial relation to reference shape. - - Reference shape. - Spatial relation. Isn't implemented for Disjoint. - The array of indices of the found shapes (int[]) - True if at least one related shape was found. - \new490 Added in version 4.9.0 - - - - Gets the state of selection for the specified shape - - The index of shape - True in case the shape is selected and false otherwise. - \new48 Added in version 4.8 - - - - Selects or deselects the specified shape - - The index of shape to be selected. - A value which indicates whether a shape should be selected. - \new48 Added in version 4.8 - - - - Inverts selection of the shapefile, i.e. selection state of every shape is changed to the opposite value. - - \see Shapefile.get_ShapeSelected - \new48 Added in version 4.8 - - - - Selects all the shapes in the shapefile - - \new48 Added in version 4.8 - - - - Clears selection from all shapes. - - \new48 Added in version 4.8 - - - - Returns an array with indices of shapes which are located inside specified bounds. - - This method doesn't change the state of selection or visualization of shapes. - The bounding rectangular to select shapes within. - The value of tolerance. - Selection mode. - An output array of long type with the indices of the shapes. - True in case at least one shape is within bounds and false otherwise. - - - Gets the value which indicates whether spatial index will be used - for displaying certain extents of the shapefile. - \see SpatialIndexMaxAreaPercent - - - - Creates a new spatial index - - The name of shapefile to create spatial index for. - Filename of the current shapefile should be passed usually (Shapefile.Filename). - - - - - Checks the validity of the spatial index. - - True if the index is valid and false on its absence or incompatibility. - - - - Removes spatial index associated with shapefile (.mwd and .mwx files). - - True on success. - \new493 Added in version 4.9.3 - - - - Checks whether there are invalid shapes within shapefile. - - True if there invalid shapes and false otherwise. - \new490 Added in version 4.9.0 - - - - Gets or sets an instance of ShapefileCategories class associated with the shapefile. - - The property can't be set to NULL (there is always an instance ShapefileCategories class associated with the Shapefile). - \new48 Added in version 4.8 - - - - Gets expression to be set for OpenFileDialog.Filter property to select ESRI shapefiles. - - - - - Gets or sets collision mode for point symbols for point and multi-point shapefiles. - - See tkCollisionMode enumeration. - \new48 Added in version 4.8 - - - - Gets or sets an instance of ShapeDrawingOptions class which holds default drawing options. - - - Default options are applied to every shape, which doesn't belong to a shapefile category. - The property can't be set to NULL (there is always an instance ShapeDrawingOptions class associated with shapefile). - - \new48 Added in version 4.8 - - - - Gets bounding box which encompass all the shapes in the shapefile. - - When fast mode is set on, Shapefile.RefreshExtents call is needed to get the correct - extents after edits where made. + \new48 Added in version 4.8 - + - Returns the handle of the shapefile. For inner use only. + Clips current shapefile by the definition shapefile. + A value which indicates whether all or only selected shape of this shapefile + will be treated as input. + The definition shapefile. + A value which indicates whether all or only selected shape of the definition shapefile + will be treated as input. + Reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets the name of the file which is used as a source for this instance of Shapefile class. + Calculates difference of 2 shapefiles. - - The property should be used for disk-based shapefiles only (see Shapefile.SourceType property). - + A value which indicates whether all or only selected shape of this shapefile + will be treated as input. + The overlay shapefile. + A value which indicates whether all or only selected shape of the overlay shapefile + will be treated as input. + Reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets or sets the instance of the Labels class associated with the shapefile. + Merges shapes of the input shapefile based on specified attribute. - The property can't be set to NULL (there is always an instance Labels class associated with shapefile). + All shapes with the same value of the attribute will be merged in a single shape. + If the shapes aren't adjacent, then multi-part shape will be created. + An index of field from attribute table of the shapefile to dissolve by. + A boolean value which indicates whether all or only selected shapes will be processed. + Reference to the output shapefile or NULL reference on failure. \new48 Added in version 4.8 - + - Gets or sets an instance of Charts class associated with the shapefile. - - The property can't be set to NULL (there is always an instance of Charts class associated with shapefile). + Creates a new instance of shapefile class with single-part shapes produced from the + multi-part shapes of the input shapefile. + Single-part input shapes are moved to the output shapefile + without changes. Attribute values are copied to the output shapefile without changes. + A value which indicates whether the operation will be applied to the selected shapes only. + A new instance of Shapefile class with resultant shapes or NULL reference on failure. \new48 Added in version 4.8 - + - Get or sets an instance of GeoProjection class associated with the shapefile. + Creates a new instance of the shapefile class and copies selected shapes of the input shapefile to it. - The property can't be set to NULL (there is always an instance of GeoProjection class associated with the shapefile). + A new instance of shapefile class with selected shapes or NULL reference on failure. \new48 Added in version 4.8 - + - Gets or sets a Callback object which handles progress and error messages of the Shapefile class. + Creates a new shapefile by fixing invalid shapes of the input shapefile. - - It's recommended to set it in case time consuming operation will be used (geoprocessing, generation of labels, etc). - The property is equal to NULL by default. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + The output shapefile. + True on successful fixing of all shapes and false if at least one shapes wasn't fixed. + \new48 Added in version 4.8 - + - Sets an object which implements IStopExecution interface and facilitates stopping of the - geoprocessing operations. + Gets or sets the engine (library) to use for geoprocessing operations. + The following methods are affected by this property. \new48 Added in version 4.8 - + - A text string associated with the shapefile. Any value can be stored by developer in this property. + Calculates intersection of 2 input shapefiles. + Intersection can generate shapes of different types. For example, the intersection of 2 polygons can be + a polygon, a polyline, a point or any combination of those. With SHP_NULLSHAPE fileType parameter the most obvious type will be used: + for example SHP_POLYGON for 2 polygon shapefiles. + A value which indicates whether operation will be applied to the selected shapes of the current shapefile only. + The second shapefile to perfrom intersection. + A value which indicates whether operation will be applied to the selected shapes of the second shapefile only. + The type of output shapefiles. SHP_NULLSHAPE value should be passed for automatic choosing of type. + An instance of class implementing ICallback interface. + Reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets the code of last error which took place inside this object. + Creates a new instance of shapefile class which holds shapes from 2 input shapefiles. - To retrieve text description of error, use Shapefile.get_ErrorMsg(Shapefile.LastErrorCode). - Check this value if a certain method has failed. + Both shapefiles must have the same ShpfileType. No changes to geometry of individual shapes are made. + Attribute values of both input shapefile will be passed to the resulting one. + + The value which indicates whether the operation will be applied + only to the selected shapes of the first shapefile. + The second shapefile to take shapes from. + A value which Indicates whether the operation will be applied + only to the selected shapes of the second shapefile + Reference to the output shapefile or NULL reference on failure + \new48 Added in version 4.8 - + - Gets the number of shapes in the shapefile. + Creates a new shapefile by re-projecting the current one. + The projection of the output shapefile. + The output value with the number of shapes successfully reprojected. + Reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets or sets the projection string for shapefile. String in proj4 and ESRI WKT formats are supported. + Reprojects shapes of the current shapefile. - \deprecated v 4.8 Use Shapefile.GeoProjection property instead. + The new projection. + The number of shapes successfully reprojected. + Returns true on success and false otherwise. + \new48 Added in version 4.8 - + - Gets the type of the shapefile. + aka SpatialQuery. Returns an array with indices of shapes of the current shapefile which + are in the specified relation to the definition shapefile. - It is not possible to change the type of the shapefile without closing it. + The definition shapefile. + The target relation between shapes of the 2 shapefiles. + The value which indicates whether only selected shapes of the definition shapefile will be used. + The resulting array of long data type with shape indices. + A callback object for passing to the client + the information about the progress and errors. + True in case at least one shape was selected and false otherwise. + \new48 Added in version 4.8 - + - Gets the value which indicate the type the data used by shapefile object. + Creates a new shapefile by removing excessive vertices from the current shapefile - See details in the description of tkShapefileSourceType enumeration. + Applicable to the polyline or polygon shapefiles only. + The initial shapefile remains intact. Attribute values are copied to the output shapefile without changes. + The minimal distance between 2 succeeding points. A succeeding point lying closer than + this value, will be removed. + A value which indicates whether all or only selected shapes will be processed. + A reference to the output shapefile or NULL reference on failure. \new48 Added in version 4.8 - + - Gets or sets the expression which defines shapes to be visible on the map. + Sorts shapes in the shapefile based on the specified attribute. - In case of empty or invalid string all the shapes will be visible. + The index of field to set the sorting order. + A value which defines the sorting order. + Reference to the output shapefile or NULL reference on failure. \new48 Added in version 4.8 - + - Gets "flattened" shapefile type, i.e. Z and M components will be ignored. + Calculates symmetrical difference of the 2 shapefiles. - \new493 Added in version 4.9.3 + The operation consists of 2 mirror-like Difference operations. + Attribute values of both shapefiles are passed to the output one without changes. + Both input shapefiles remain intact. + A value which indicates that only selected shapes of the first shapefile will be processed. + The second shapefile. + A value which indicates that only selected shapes of the second shapefile will be processed. + A reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets or sets a value indicating whether this shapefile will be visible to cmIdentify tool. + Calculates union of 2 shapefiles. - \see AxMap.CursorMode - \new493 Added in version 4.9.3 + The operation consists of intersection operation and 2 mirror-like difference operations. + The value which indicates that only selected shapes of the first shapefile will be processed. + The second shapefile. + The value which indicates that only selected shapes of the second shapefile will be processed. + A reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets a value indicating whether shapefile is in append mode. - Any shapes added with Shapefile.EditAddShape will be immediately written to the disk. + Splits polylines at intersection with any other polylines. Works for polyline shapefile only. - \new494 Added in version 4.9.4 + Resulting shapefile or null if the operation wasn't successful. + \new490 Added in version 4.9.0 - + - The name of the field to be used to determine the drawing order of point shapes and labels. + Clears GEOS geometries cached during certain geoprocessing tasks. - \new494 Added in version 4.9.4 + Shapefile.GetRelatedShapes currently is the only method that uses such caching + to improve performance if search is performed multiple times for different shapes. + \new491 Added in version 4.9.1 - + + \addtogroup shapefile_management Shapefile open and close + Here is a list of methods which affect the state of the shapefile. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_management { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Management" URL="\ref shapefile_management"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ - Gets or sets a value indicating whether shapes will be sorted in ascending order. + Loads data into in-memory shapefile from the specified shapefile on the disk. - \see SortField - \new494 Added in version 4.9.4 + Filename of the shapefile to load from. + Callback interface. + True on success and false otherwise. + The shapefile object with remain in in-memory state. + \new491 Added in version 4.9.1 - + - Gets the value indicating whether editing operations are allowed for shapefile attribute table. + Writes the contents of the shapefile to specified file. - Use Shapefile.StartEditingTable and Shapefile.StopEditingTable to control editing mode. + Filename to write shapefile data to. + Callback interface. + True on success and false otherwise. + The state of shapefile won't be affected, i.e. in-memory shapefile will remain in-memory one. + \new491 Added in version 4.9.1 - + + Creates a copy of the shapefile. + Output shapefile will have the same type, projection and fields of the attribute table, + while shapes and the records of the attribute table aren't copied. + For complete copy of the shapefile use Shapefile.SelectAll() and Shapefile.ExportSelection(). + \new48 Added in version 4.8 + + - Gets the number of fields in attribute table of the shapefile. + Closes shapefile and releases all the resources. + In case shapefile is in editing mode (Shapefile.EditingShapes = true) + all the edits will be discarded. + This value should not be analysed. - + + - Gets the reference to the attribute table associated with the shapefile. + Initializes in-memory shapefile of the specified type with unique index field. + MWShapeID field will be added to the attribute table. An increasing unique positive integer value + will be set in this field for each shape added to the shapefile. The field with MWShapeID name + created manually will be treated in the same way. + The name of the new shapefile. An empty string should be passed here. + Type of the shapefile to create. + Returns true on success and false otherwise. - + - Gets the value indicating whether editing operations are allowed for shapefile. + Opens shapefile from the disk. - Shapefile.EditInsertShape, Shapefile.EditDeleteShape, Shapefile.EditClear are affected by this property. - \n Use Shapefile.StartEditingShapes and Shapefile.StopEditingShapes to control the editing mode. + Any other shapefile currently opened will be closed without saving the changes. + Shapefile.SourceType property will be set to sstDiskBased. + The name of the file to open (.shp extension). + A callback object to report errors and progress information. + True on success and false otherwise. + Use Shapefile.get_ErrorMsg(Shapefile.LastErrorCode) to find out the reason of failure. - + - Gets or sets a value indicating whether shapefile can be redrawn without redrawing other layer on the map. + Changes file associated with the current instance of the shapefile class. - - All volatile shapefiles will be placed in main screen buffer (along with drawing layers) rather than data layer buffer, - so that their redraw can be forced with AxMap.Redraw2(tkRedrawType.RedrawSkipDataLayers). This can be recommended - for in-memory shapefiles with constantly changing values to ensure rendering performance. - - \new492 Added in version 4.9.2 + It is equivalent to consequent calling of Shapefile.Close and Shapefile.Open. + The filename of the new shapefile to be opened. + True on successful opening of the new shapefile or false otherwise. - + - Gets or sets a value indicating whether a shapefile can be edited with built-in interactive tools. + Saves edits of the in-memory shapefile to the disk without closing editing mode. - Setting the property to true will automatically call Shapefile.StartEditingShapes if - shapefile hasn't been loaded in the memory already. Setting it false won't call Shapefile.StopEditingShapes, - only interactive tools will be disabled. - Interactive editing mode automatically sets Shapefile.Volatile property to true. - \see ShapeEditor, AxMap.CursorMode - \new493 Added in version 4.9.3 + Applicable only when Shapefile.EditingShapes = true. + A callback object to report errors and progress information. + True on successful saving and false otherwise. - + - Gets or sets a value indicating whether interactive editing tools can snap to vertices of the shapefile. + Saves in-memory shapefile to the disk. - \new493 Added in version 4.9.3 + The name of the file to save data in. + A callback object to report errors and progress information. + True on successful saving and false otherwise. - + - Gets or sets the engine (library) to use for geoprocessing operations. + Saves shapefile to the disk. - The following methods are affected by this property. - \new48 Added in version 4.8 + The new filename. + If set to true the editing for shapefile will be stopped. + If set to true the file will not be assigned as a source of this instance. + True on success. + \new494 Added in version 4.9.4 + \addtogroup shapefile_optimizations Shapefile optimizations + Here is a list of properties and methods which doesn't provide additional functionality but + can improve the speed of certain operations with shapefile. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_optimizations { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Optimizations" URL="\ref shapefile_optimizations"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Gets or sets a boolean value which indicates whether extents of shape will be recalculated before each redraw. @@ -14398,10 +14586,39 @@ but assign new coordinates to the points by calling Shape.put_XY only; - if you are bound to the exiting code with Shape.get_Point.x = [value] calls, set this property to true but call Shapefile.RefreshShapeExtents after the editing operations. - . - . \new48 Added in version 4.8 + + + Caches the coordinates of shapefile points for faster point in shape test. + + Shapefile.EndPointInShapefile call is needed to release the memory. + True on successful caching and false otherwise. + + + + Clears the cached data allocated by Shapefile.BeginPointInShapefile. + + + + + Returns boolean value which indicates whether the given point is located within the specified shape. + + The operation is applicable for polygon shapefiles only. + The index shape (polygon) to perform the test. + X coordinate of the point. + Y coordinate of the point. + True in case the point is located within polygon and false otherwise. + + + + Returns a number which indicates the index of shapes within which a test point is situated. + + Call Shapefile.BeginPointInShapefile to improve performance. + The x coordinate of the point. + The y coordinate of the point. + The index of shape. + Gets or sets the value which indicates whether fast mode will be used for the shapefile. @@ -14425,6 +14642,136 @@ \new48 Added in version 4.8 + + + Returns the number of points in the specified shape of the shapefile. + + This property is more efficient than calling Shapefile.get_Shape().NumPoints. + The index of the shape. + The number of points or -1 in case of invalid index. + There is a confusion with name casing for this property. + It's actually spelled 'get_NumPoints' in the source code. + However because of the known bug in PIA generation process the property + ended up spelled 'get_numPoints' in earlier version of PIAs. After some hesitation we decided to keep it that way. + See description of the bug here: http://stackoverflow.com/questions/3179676/c-exposed-property-for-com-in-idl-is-showing-as-lower-case-all-of-a-sudden + + + + Returns the extents of the shape with the given index. + + This operation is faster than Shapefile.get_Shape().Extents as there is no need to read all the shape data. + The index of the shape. + The extents of shape or NULL reference on failure. + + + + Returns the specified point of shape. + + This operation doesn't require the reading of all shape date from disk, therefore + it will be faster when editing mode is false. + The index of shape. + The point index. + The point or the NULL reference on the invalid index. + + + + Returns an array with the coordinates of points of the specified shape. + + The value specified in numPoints will be adjusted if the specified number is greater than the number of points. + The index of shape. + The number of point to return. + The array of double type with coordinates of the point. + Every two elements represent x and y coordinate of the point respectively. + + + + Refreshes extents of all shapes in the shapefile. + + See Shapefile.CacheExtents for the details. + The value can be omitted. + \new48 Added in version 4.8 + + + + Refreshes the extents of the particular shape in the shapefile. + + See Shapefile.CacheExtents for the details. + The index of the shape which extents are to be refreshed. + True on success and false in case of invalid shape index. + \new48 Added in version 4.8 + + + \addtogroup shapefile_selection Shapefile selection + Here is a list of properties and methods for managing shapefile selection. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_selection { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Selection" URL="\ref shapefile_selection"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + + Gets the vertex closest to the specified point. + + X coordinate of the point to search from. + Y coordinate of the point to search from. + Maximum distance to search. Use 0 to search at any distance. Passing the max distance can improve performance. + Index of shape to which closest vertex belongs. + Index of closest vertex within shape. + The distance to the closest vertex. + True if the vertex was found within specified distance and false otherwise. + \new490 Added in version 4.9.0 + + + + Gets shapes which are located at specified spatial relation to reference shape. + + Index of reference shape. + Spatial relation. Isn't implemented for Disjoint. + The array of indices of the found shapes (int[]) + True if at least one related shape was found. + \new490 Added in version 4.9.0 + + + + Gets shapes which are located at specified spatial relation to reference shape. + + Reference shape. + Spatial relation. Isn't implemented for Disjoint. + The array of indices of the found shapes (int[]) + True if at least one related shape was found. + \new490 Added in version 4.9.0 + + + + Gets the state of selection for the specified shape + + The index of shape + True in case the shape is selected and false otherwise. + \new48 Added in version 4.8 + + + + Selects or deselects the specified shape + + The index of shape to be selected. + A value which indicates whether a shape should be selected. + \new48 Added in version 4.8 + + + + Inverts selection of the shapefile, i.e. selection state of every shape is changed to the opposite value. + + \see Shapefile.get_ShapeSelected + \new48 Added in version 4.8 + Gets the number of selected shapes in the shapefile. @@ -14432,6 +14779,18 @@ \see Shapefile.get_ShapeSelected \new48 Added in version 4.8 + + + Selects all the shapes in the shapefile + + \new48 Added in version 4.8 + + + + Clears selection from all shapes. + + \new48 Added in version 4.8 + Gets or sets the way shapefile selection will be displayed. @@ -14460,12 +14819,58 @@ \new48 Added in version 4.8 + + + Returns an array with indices of shapes which are located inside specified bounds. + + This method doesn't change the state of selection or visualization of shapes. + The bounding rectangular to select shapes within. + The value of tolerance. + Selection mode. + An output array of long type with the indices of the shapes. + True in case at least one shape is within bounds and false otherwise. + + + \addtogroup shapefile_spatial_index Shapefile spatial index + Here is a list of properties and methods for managing of spatial index for a shapefile. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_sptial_index { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Spatial index" URL="\ref shapefile_spatial_index"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + Gets the value which indicates whether spatial index will be used + for displaying certain extents of the shapefile. + \see SpatialIndexMaxAreaPercent + + + + Creates a new spatial index + + The name of shapefile to create spatial index for. + Filename of the current shapefile should be passed usually (Shapefile.Filename). + + Gets the value indicating whether spatial index exists for the shapefile. The set part of property does nothing. Use Shapefile.CreateSpatialIndex instead to create a new index. + + + Checks the validity of the spatial index. + + True if the index is valid and false on its absence or incompatibility. + Gets or sets the value which affects the usage of spatial index. @@ -14487,6 +14892,14 @@ Gets or sets a value which indicates whether spatial index should be used while working with shapefile. + + + Removes spatial index associated with shapefile (.mwd and .mwx files). + + True on success. + \new493 Added in version 4.9.3 + + Gets results of input data validation for geoprocessing methods. @@ -14501,5 +14914,11 @@ Use GlobalSettings.ShapeOutputValidationMode to change the settings. \new491 Added in version 4.9.1 + + + List of known extents (mostly countries of the world) + + \new491 Added in version 4.9.1 + diff --git a/docs/Interop.MapWinGIS/Com Classes/GdalDataset.cs b/docs/Interop.MapWinGIS/Com Classes/GdalDataset.cs index f563e441..739a840d 100644 --- a/docs/Interop.MapWinGIS/Com Classes/GdalDataset.cs +++ b/docs/Interop.MapWinGIS/Com Classes/GdalDataset.cs @@ -67,10 +67,17 @@ public bool SetProjection(string Projection) throw new NotImplementedException(); } + public string GetSubDatasetName(int subDatasetIndex) + { + throw new NotImplementedException(); + } + /// /// Gets the driver which manages this datasource. /// public GdalDriver Driver { get; private set; } + + public int SubDatasetCount { get; } } #if nsp } diff --git a/docs/Interop.MapWinGIS/Com Classes/GdalUtils.cs b/docs/Interop.MapWinGIS/Com Classes/GdalUtils.cs new file mode 100644 index 00000000..174c193a --- /dev/null +++ b/docs/Interop.MapWinGIS/Com Classes/GdalUtils.cs @@ -0,0 +1,172 @@ +// ReSharper disable UnassignedGetOnlyAutoProperty +#if nsp +namespace MapWinGIS +{ +#endif + using System; + /// + /// Implementation of the GDAL v2 librified functions. + /// Not all functions are implemented yet. + /// + /// \new495 Added in version 4.9.5 +#if nsp +#if upd + public class GdalUtils : MapWinGIS.IGdalUtils +#else + public class IGdalUtils +#endif +#else + public class GdalUtils +#endif + { + /// + /// Retrieves the last error generated in the object. + /// + /// \new495 Added in version 4.9.5 + public int LastErrorCode { get; } + + /// + /// The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + /// + /// \new495 Added in version 4.9.5 + public ICallback GlobalCallback { get; set; } + + /// + /// The key may be used by the programmer to store any string data associated with the object. + /// + /// \new495 Added in version 4.9.5 + public string Key { get; set; } + + /// + /// Gets the detailed error message. + /// + /// \new495 Added in version 4.9.5 + public string DetailedErrorMsg { get; } + + /// + /// Image reprojection and warping utility. + /// Implementing the librified function of GDAL's gdalwarp.exe tool + /// + /// The source filename. + /// The destination filename. + /// The options, as a string array + /// See GDAL's documentation here: http://www.gdal.org/gdalwarp.html + /// \new495 Added in version 4.9.5 + /// + /// \code + /// // Example of creating VRT file from TIFF file. More options are possible: + /// var output = Path.GetTempPath() + "GdalWarp.vrt"; + /// var options = new[] + /// { + /// "-of", "vrt", + /// "-overwrite" + /// }; + /// var gdalUtils = new GdalUtils(); + /// if (!gdalUtils.GDALWarp("test.tif", output, options)) + /// { + /// Debug.WriteLine("GdalWarp failed: " + gdalUtils.ErrorMsg[gdalUtils.LastErrorCode] + " Detailed error: " + gdalUtils.DetailedErrorMsg); + /// } + /// \endcode + /// + /// \code + /// // Example of cutting a TIFF file with a border file: + /// var output = Path.GetTempPath() + "GdalWarpCutline.vrt"; + /// const string border = @"test.shp"; + + /// var options = new[] + /// { + /// "-of", "vrt", + /// "-overwrite", + /// "-crop_to_cutline", + /// "-cutline", border + /// }; + /// var gdalUtils = new GdalUtils(); + /// if (!gdalUtils.GDALWarp("test.tif", output, options)) + /// { + /// Debug.WriteLine("GdalWarp failed: " + gdalUtils.ErrorMsg[gdalUtils.LastErrorCode] + " Detailed error: " + gdalUtils.DetailedErrorMsg); + /// } + /// \endcode + public bool GDALWarp(string bstrSrcFilename, string bstrDstFilename, Array Options) + { + throw new NotImplementedException(); + } + + /// + /// Converts simple features data between file formats. + /// Implementing the librified function of GDAL's ogr2ogr.exe tool + /// + /// The source filename. + /// The destination filename. + /// The options, as a string array + /// If set to true improves performance but also might make it instable. + /// See GDAL's documentation here: http://www.gdal.org/ogr2ogr.html + /// \new495 Added in version 4.9.5 + /// + /// \code + /// // Converting shapefile to gml: + /// var outputFilename = Path.Combine(Path.GetTempPath(), "translated.gml"); + /// var options = new[] + /// { + /// "-f", "GML" + /// }; + /// var gdalUtils = new GdalUtils(); + /// if (!gdalUtils.GdalVectorTranslate(inputFilename, outputFilename, options, true)) + /// { + /// Debug.WriteLine("GdalVectorTranslate failed: " + gdalUtils.ErrorMsg[gdalUtils.LastErrorCode] + " Detailed error: " + gdalUtils.DetailedErrorMsg); + /// } + /// \endcode + public bool GdalVectorTranslate(string bstrSrcFilename, string bstrDstFilename, Array Options, + bool useSharedConnection = false) + { + throw new NotImplementedException(); + } + + /// + /// Clips the vector with another vector. + /// + /// The subject filename. + /// The overlay filename. + /// The destination filename. + /// If set to true improves performance but also might make it instable. + /// Uses GdalUtils.GdalVectorTranslate under the hood. + /// \new495 Added in version 4.9.5 + /// + /// \code + /// // Clipping large shapefile with border file + /// const string subjectFilename = @"D:\dev\GIS-Data\Issues\MWGIS-78 Clipper\Fishnet.shp"; + /// const string borderFilename = @"D:\dev\GIS-Data\Issues\MWGIS-78 Clipper\border.shp"; + /// var outputFilename = Path.Combine(tempFolder, "GdalVectorTranslate.shp"); + /// var gdalUtils = new GdalUtils(); + /// if (!gdalUtils.ClipVectorWithVector("LargeFile.shp", "Border.shp", outputFilename)) + /// { + /// Debug.WriteLine("GdalVectorTranslate failed: " + gdalUtils.ErrorMsg[gdalUtils.LastErrorCode] + " Detailed error: " + gdalUtils.DetailedErrorMsg); + /// } + /// \endcode + public bool ClipVectorWithVector(string bstrSubjectFilename, string bstrOverlayFilename, string bstrDstFilename, + bool useSharedConnection = true) + { + throw new NotImplementedException(); + } + + /// + /// Retrieves the error message associated with the specified error code. + /// + /// The error code for which the error message is required. + /// The error message description for the specified error code. + /// \new495 Added in version 4.9.5 + public string get_ErrorMsg(int ErrorCode) + { + throw new NotImplementedException(); + } + + /// + /// The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + /// + /// \new495 Added in version 4.9.5 + ICallback IGdalUtils.GlobalCallback + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + } +} diff --git a/docs/Interop.MapWinGIS/Com Classes/GlobalSettings.cs b/docs/Interop.MapWinGIS/Com Classes/GlobalSettings.cs index 87390fea..73b52878 100644 --- a/docs/Interop.MapWinGIS/Com Classes/GlobalSettings.cs +++ b/docs/Interop.MapWinGIS/Com Classes/GlobalSettings.cs @@ -433,6 +433,16 @@ public tkOgrEncoding OgrStringEncoding /// \new493 Added in version 4.9.3 public int OgrLayerMaxFeatureCount { get; set; } + /// + /// Applies to conversion of OGR Shapefile layers to MapWinGIS Shapefiles (via GetBuffer), since + /// OGR Shapefiles do not support Logical fields. Instead, DBF Logical fields are read as single- + /// character strings. This property Gets or Sets a value which indicates whether to interpret + /// single-character Ogr strings as Logical/Boolean values, as long as the character contained + /// in the string is one of valid DBF logical characters (e.g. Y, N, T, F). The default value is true. + /// + /// \new495 Added in version 4.9.5 + public bool OgrInterpretYNStringAsBoolean { get; set; } + /// /// Gets or sets a value which indicates whether OgrLayer.DynamicLoading mode will /// chosen automatically based on the number of features. The default value is true. @@ -551,16 +561,14 @@ public int HotTrackingMaxShapeCount public string GdalPluginPath { get; set;} /// - /// Gets or sets API key to access Bing maps. Without API key Bing Maps provider isn't available. See - /// details here. + /// Gets or sets API key to access Bing maps. Without API key Bing Maps provider isn't available. /// /// \new493 Added in version 4.9.3 public string BingApiKey { get; set;} /// /// Sets application credentials for Here Maps online tiles. - /// Without these credentials Here Maps providers are not available. See - /// details here. + /// Without these credentials Here Maps providers are not available. /// /// Application Id. Can be obtained by registering on the site of the service. /// Application code. Can be obtained by registering on the site of the service. @@ -653,6 +661,13 @@ public bool TestBingApiKey(string Key) /// \new494 Added in version 4.9.4 public tkCallbackVerbosity CallbackVerbosity { get; set; } + /// + /// Share connection between layers (may be unstable). + /// For large read-only layers it will increase performance. + /// + /// \new494 Added in version 4.9.4 + public bool OgrShareConnection { get; set; } + /// /// Starts logging of tile requests. /// diff --git a/docs/Interop.MapWinGIS/Com Classes/Image.cs b/docs/Interop.MapWinGIS/Com Classes/Image.cs index d9116345..9e038eaf 100644 --- a/docs/Interop.MapWinGIS/Com Classes/Image.cs +++ b/docs/Interop.MapWinGIS/Com Classes/Image.cs @@ -10,7 +10,8 @@ namespace MapWinGIS /// /// Represents an raster image of particular format which may be added to the map. /// - /// \dot digraph image_diagram { + /// \dot + /// digraph image_diagram { /// nodesep = 0.3; /// ranksep = 0.3; /// splines = ortho; diff --git a/docs/Interop.MapWinGIS/Com Classes/OgrDatasource.cs b/docs/Interop.MapWinGIS/Com Classes/OgrDatasource.cs index e07dd752..76da2395 100644 --- a/docs/Interop.MapWinGIS/Com Classes/OgrDatasource.cs +++ b/docs/Interop.MapWinGIS/Com Classes/OgrDatasource.cs @@ -81,7 +81,8 @@ namespace MapWinGIS /// and new objects. See details about string encoding in the documentation of particular OGR driver.\n\n /// /// Here is a diagram for the OgrDatasource class. - /// \dot digraph ogr_diagram { + /// \dot + /// digraph ogr_diagram { /// nodesep = 0.3; /// ranksep = 0.3; /// splines = ortho; @@ -133,6 +134,11 @@ public bool Open(string connectionString) throw new NotImplementedException(); } + public OgrLayer GetLayer2(int Index, bool forUpdate, bool newConnection) + { + throw new NotImplementedException(); + } + /// /// Opens particular type of datasource supported by GDAL/OGR. /// diff --git a/docs/Interop.MapWinGIS/Com Classes/OgrLayer.cs b/docs/Interop.MapWinGIS/Com Classes/OgrLayer.cs index 459b4e6d..30005b5e 100644 --- a/docs/Interop.MapWinGIS/Com Classes/OgrLayer.cs +++ b/docs/Interop.MapWinGIS/Com Classes/OgrLayer.cs @@ -210,7 +210,8 @@ namespace MapWinGIS /// \note See description of editing in this section.\n /// /// \n Here is a diagram for the %OgrLayer class. - /// \dot digraph ogr_diagram { + /// \dot + /// digraph ogr_diagram { /// nodesep = 0.3; /// ranksep = 0.3; /// splines = ortho; @@ -477,6 +478,8 @@ public string DriverName /// \new494 Added in version 4.9.4 public ShpfileType ActiveShapeType { get; set; } + public bool IsExternalDatasource { get; } + /// /// Gets layer name or SQL query which was used to open this layer. /// diff --git a/docs/Interop.MapWinGIS/Com Classes/ShapeEditor.cs b/docs/Interop.MapWinGIS/Com Classes/ShapeEditor.cs index 0e51acc0..1bafab3a 100644 --- a/docs/Interop.MapWinGIS/Com Classes/ShapeEditor.cs +++ b/docs/Interop.MapWinGIS/Com Classes/ShapeEditor.cs @@ -111,12 +111,12 @@ namespace MapWinGIS /// /// \note The fully working implementation of the shape editor can be examined in the the Demo application /// included in MapWinGIS installation (starting from v4.9.3). The source code for this application is available in - /// the repository. + /// the repository. /// /// \new493 Added in version 4.9.3 - #if nsp - #if upd - public class ShapeEditor : MapWinGIS.IShapeEditor +#if nsp +#if upd + public class ShapeEditor : MapWinGIS.IShapeEditor #else public class IShapeEditor #endif diff --git a/docs/Interop.MapWinGIS/Com Classes/Shapefile.cs b/docs/Interop.MapWinGIS/Com Classes/Shapefile.cs index 5482d9e1..45b8856f 100644 --- a/docs/Interop.MapWinGIS/Com Classes/Shapefile.cs +++ b/docs/Interop.MapWinGIS/Com Classes/Shapefile.cs @@ -1502,8 +1502,6 @@ public bool SaveAsEx(string newFilename, bool stopEditing, bool unboundFile) /// but assign new coordinates to the points by calling Shape.put_XY only; /// - if you are bound to the exiting code with Shape.get_Point.x = [value] calls, set this property to true but call /// Shapefile.RefreshShapeExtents after the editing operations. - /// . - /// . /// \new48 Added in version 4.8 public bool CacheExtents { diff --git a/docs/Interop.MapWinGIS/Com Classes/ShapefileColorBreak.cs b/docs/Interop.MapWinGIS/Com Classes/ShapefileColorBreak.cs deleted file mode 100644 index c0b5bdb5..00000000 --- a/docs/Interop.MapWinGIS/Com Classes/ShapefileColorBreak.cs +++ /dev/null @@ -1,83 +0,0 @@ - -#if nsp -namespace MapWinGIS -{ -#endif - using System; - - /// - /// Defines a part of shapefile color scheme and specifies how a certain region of a shapefile will be colored. - /// - /// \deprecated in v. 4.8. Use ShapefileCategories, ShapefileCategory, ColorScheme classes instead. - /// \removed493 Removed in 4.9.3 - #if nsp - #if upd - public class ShapefileColorBreak : MapWinGIS.IShapefileColorBreak - #else - public class IShapefileColorBreak - #endif - #else - public class ShapefileColorBreak - #endif - { - #region IShapefileColorBreak Members - /// - /// Gets or sets the caption of the shapefile color break. - /// - public string Caption - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets or sets the color which will be used for drawing objects characterized by ShapefileColorBreak.EndValue. - /// - public uint EndColor - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets or sets the value which represent the end of shapefile color break. - /// - public object EndValue - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets or sets the color which will be used for drawing objects characterized by ShapefileColorBreak.StartValue. - /// - public uint StartColor - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets or sets the value which represent the start of shapefile color break. - /// - public object StartValue - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets or sets a boolean value which indicates whether the objects defined by color break will be displayed. - /// - public bool Visible - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - #endregion - } -#if nsp -} -#endif - diff --git a/docs/Interop.MapWinGIS/Com Classes/TileProviders.cs b/docs/Interop.MapWinGIS/Com Classes/TileProviders.cs index 039c2407..45567d84 100644 --- a/docs/Interop.MapWinGIS/Com Classes/TileProviders.cs +++ b/docs/Interop.MapWinGIS/Com Classes/TileProviders.cs @@ -26,7 +26,7 @@ public class TileProviders /// Arbitrary name of provider. /// Url pattern for provider. The pattern may include the following varying components: /// {zoom}, {x}, {y}, {switch:n1,n2,n3}. For example, the following can be used to setup OpenStreetMap - /// as custom provider: "http://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png". + /// as custom provider: "https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png". /// Projection used by tile server. Projection must not necessarily match the map projection. /// MapWinGIS will try to do the transformation even if projection don't match, though these may lead to /// distortions and gaps between tiles. diff --git a/docs/Interop.MapWinGIS/Com Classes/Tiles.cs b/docs/Interop.MapWinGIS/Com Classes/Tiles.cs index 202c90e1..c8ef99c5 100644 --- a/docs/Interop.MapWinGIS/Com Classes/Tiles.cs +++ b/docs/Interop.MapWinGIS/Com Classes/Tiles.cs @@ -1,823 +1,857 @@ -using System; -using MapWinGIS; - -#if nsp +using System; +using MapWinGIS; + +#if nsp namespace MapWinGIS -{ -#endif - /// \anchor a_tiles - /// - /// Downloads and displays data from online TMS tile services, like OpenStreetMap. - /// - /// \attention MapWinGIS doesn't grant you any legal rights to use data from - /// particular online services. Please look for license information on acceptable usages of the data - /// on official sites of these services. - /// - /// Online tile services provide 2D maps of Earth surface, which are split into small parts (usually 256 by 256 pixels) called tiles. Tiles are - /// provided at a number of zoom levels with greater detail on each subsequent level. Typically there are about 15-20 zoom levels with just 4 tiles - /// for the whole Earth surface on the first one, and 4^zoom on subsequent levels. Depending on service the maps can be: - /// - synthetic: features of Earth surface are displayed with some arbitrary set of symbols (OpenStreetMap, GoogleMaps); - /// - satellite: satellite imagery (Bing satellite, Google satellite); - /// - hybrid: labels and objects displayed on top of satellite map. - /// - /// To get more information on tiles services see specification: here.\n - /// - /// A. Coordinate system and projection.\n\n - /// In order to display tiles from online datasource the coordinate system & projection of server must match or at least be compatible with those - /// settings for the map control. Three scenarios are possible: - /// \dot - /// digraph tiles_projection { - /// splines = true; - /// ranksep = 0.15; - /// nodesep = 0.5; - /// node [shape = oval, peripheries = 1, fontname=Helvetica, fontsize=9, fillcolor = gray, color = "gray", style = filled, height = 0.3, width = 0.8]; - /// render [ label="Tiles projection scenarios"]; - /// - /// node [shape = "note", width = 0.3, height = 0.3, peripheries = 1 fillcolor = "khaki" ] - /// s1 [label=" Projections match\l"]; - /// s2 [label=" Projections are compatible\l"]; - /// s3 [label=" Not compatible or no projection for the map\l"]; - /// - /// edge [dir = none, arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#808080" minlen=2 ] - /// render -> s1; - /// render -> s2; - /// render -> s3; - /// } - /// \enddot - /// \n - ///
- /// 1) Projections match: tiles will be displayed in their native projection without distortions.\n\n - /// 2) Projections don't match but transformation from server projection to map projection is possible: tiles will be displayed with distortions, - /// which may be acceptable in some cases (spherical Mercator server projection, WGS84 map coordinate system) or hardly usable in others (spherical Mercator - /// server projection, UTM projection of WGS84 as map projection).\n\n - /// 3) No projections for map is set or map/server projections doesn't match and there is no transformation between them: tiles can't be displayed.\n - ///
- /// Here are screenshots which illustrate types of distortions introduced by projection mismatch - /// (server projection is Spherical Mercator). - /// - ///
- /// - /// - /// - /// - /// - /// - /// - /// - /// - ///
\image html tiles_wgs84.jpg\image html tiles_utm16.jpg
Spherical Mercator -> WGS84Spherical Meractor -> WGS84 UTM16
- ///
- /// To check whether map projection match the server one use Tiles.ProjectionStatus property.\n\n - /// Most tile servers like OpenStreetMap, GoogleMaps, etc. are using spherical Mercator projection (aka Google Mercator; EPSG 3857). Therefore in - /// most cases it may be set without additional checks: - /// \code - /// axMap1.Projection = tkMapProjection.PROJECTION_GOOGLE_MERCATOR; - /// \endcode - /// - /// More generalized code to initialize map control with projection used by tile server is: - /// \code - /// var ut = new Utils(); - /// tkTileProjection pr = axMap1.Tiles.ServerProjection; - /// GeoProjection gp = ut.TileProjectionToGeoProjection(pr); - /// axMap1.GeoProjection = gp; - /// Debug.Print("Projection was set: " + axMap1.GeoProjection.Name); - /// Debug.Print("Tiles projection status: " + axMap1.Tiles.ProjectionStatus.ToString()); - /// //if all went was tpsNative status will be returned, i.e. rendering in native projection - /// \endcode - /// - /// B. Providers.\n - /// - /// MapWinGIS supports built-in default providers and custom providers. - /// \dot - /// digraph caching_types { - /// splines = true; - /// ranksep = 0.15; - /// nodesep = 0.5; - /// node [shape = oval, peripheries = 1, fontname=Helvetica, fontsize=9, fillcolor = gray, color = "gray", style = filled, height = 0.3, width = 0.8]; - /// render [ label="Tile providers"]; - /// - /// node [shape = "note", width = 0.3, height = 0.3, peripheries = 1 fillcolor = "khaki" ] - /// s1 [label=" Default built-in\l"]; - /// s2 [label=" Custom configured by user\l"]; - /// - /// edge [dir = none, arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#808080" minlen=2 ] - /// render -> s1; - /// render -> s2; - /// } - /// \enddot - /// - /// MapWinGIS has a number of built-in providers defined in tkTileProvider enumeration. To activate one of those use: - /// \code - /// axMap1.Tiles.Provider = tkTileProvider.OpenCycleMap; - /// // or a shorter version - /// axMap1.TileProvider = tkTileProvider.OpenCycleMap; - /// \endcode - /// The default provider is OpenStreetMap. - /// - /// To display list of available providers and their settings: - /// \code - /// TileProviders providers = axMap1.Tiles.Providers; - /// for (int i = 0; i < providers.Count; i++) - /// { - /// Debug.WriteLine("Provider name: " + providers.get_Name(i)); - /// Debug.WriteLine("Provider type: " + (providers.get_IsCustom(i) ? "custom" : "default")); - /// Debug.WriteLine("Min zoom: " + providers.get_MinZoom(i)); - /// Debug.WriteLine("Min zoom: " + providers.get_MinZoom(i)); - /// Debug.WriteLine("-----------------------------------"); - /// } - /// \endcode - /// - /// To add a custom provider to the list (in this example OpenStreetMap is configured as custom provider): - /// \code - /// TileProviders providers = axMap1.Tiles.Providers; - /// int providerId = (int)tkTileProvider.ProviderCustom + 1; // (1024 + 1) should be unique across application runs in case disk caching is used - /// providers.Add(providerId, "Custom TMS provider", - /// "http://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png", - /// tkTileProjection.SphericalMercator, 0, 18); - /// \endcode - /// The following placeholders can be used: - /// - "{zoom}", "{x}", "{y}" will be substituted with value for particular tiles to form HTTP request; - /// - "{switch:a,b,c}" will randomly choose one of the comma separated values, thus switching between URLs of servers. - /// - /// To set this provider as an active one: - /// \code - /// axMap1.Tiles.ProviderId = providerId; - /// // the same property can be used to set default providers as well - /// // because enumerated constant values match their id: - /// axMap1.Tiles.ProviderId = (int)tkTileProvider.OpenStreetMap; - /// \endcode - /// - /// To retrieve custom provider already added to the list: - /// \code - /// int providerId = 1025; // id of provider passed to TileProviders.Add method - /// TileProviders providers = axMap1.Tiles.Providers; - /// int index = providers.get_IndexByProviderId(providerId); - /// Debug.WriteLine("The recently added custom provider is: " + providers.get_Name(index)); - /// \endcode - /// It's necessary to distinguish unique providerId passed to TileProviders.Add method and used by caching mechanism, - /// and index of provider in TileProviders collection which may differ across application runs. - /// To get index in collection by providerId use TileProviders.get_IndexByProviderId. - /// - /// C. Zoom levels.\n\n - /// Originally MapWinGIS doesn't support concept of discrete zoom levels and can display any arbitrary zoom level between those defined by tile - /// service. This will lead to scaling of tiles, i.e. separate images will be drawn - /// using size other than their original (256 by 256 pixels), which may decrease their readability. To force MapWinGIS to display tiles without - /// scaling set: - /// \code - /// axMap1.ZoomBehavior = zmUseTileLevels; - /// \endcode - /// Map can also be zoomed to particular tile level: - /// \code - /// axMap1.ZoomToTileLevel(10); - /// // or - /// axMap1.CurrentZoom = 10; // available from Form designer - /// \endcode - /// Zoom levels supported by active provider can be accessed via Tiles.MinZoom, Tiles.MaxZoom properties: - /// \code - /// Debug.WriteLine(string.Format("Provider {0} supports zoom levels from {1} to {2}", axMap1.Tiles.Provider.ToString(), - /// axMap1.Tiles.MinZoom, axMap1.Tiles.MaxZoom)); - /// \endcode - /// Available zoom levels for other providers can be retrieved via: TileProviders.get_MaxZoom, TileProviders.get_MinZoom. - /// Visibility of data layers displayed on the map can set for specific zoom levels only with: AxMap.set_LayerMaxVisibleZoom, - /// AxMap.set_LayerMaxVisibleZoom. - /// - /// D. Caching.\n\n - /// To speed up the display and reduce network traffic it's common to use caching for tiles, i.e. save them locally for further reuse. - /// MapWinGIS supports 2 types of tile cache: - /// - RAM cache: tiles are stored in memory (is on by default); - /// - disk cache: tiles are stored in SQLite database (by default existing database is used but no new tiles are written to it). - /// - /// \dot - /// digraph caching_types { - /// splines = true; - /// ranksep = 0.15; - /// nodesep = 0.5; - /// node [shape = oval, peripheries = 1, fontname=Helvetica, fontsize=9, fillcolor = gray, color = "gray", style = filled, height = 0.3, width = 0.8]; - /// render [ label="Caching types"]; - /// - /// node [shape = "note", width = 0.3, height = 0.3, peripheries = 1 fillcolor = "khaki" ] - /// s1 [label=" RAM caching\l"]; - /// s2 [label=" Disk caching (SQLite)\l"]; - /// - /// edge [dir = none, arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#808080" minlen=2 ] - /// render -> s1; - /// render -> s2; - /// } - /// \enddot - /// - /// To enable cache usage: - /// \code - /// axMap1.Tiles.set_UseCache(tkCacheType.Disk, true); // is on by default - /// axMap1.Tiles.set_UseCache(tkCacheType.RAM, true); // is on by default - /// \endcode - /// - /// To make MapWinGIS add newly downloaded tiles to cache: - /// \code - /// axMap1.Tiles.set_DoCaching(tkCacheType.RAM, true); // is on by default - /// axMap1.Tiles.set_DoCaching(tkCacheType.Disk, true); // if off by default - /// \endcode - /// - /// At this point new SQLite database will created to store tiles if it wasn't created so far. Default filename is mwtiles.db3. - /// Location - the folder with application executable. To change location of disk cache use Tiles.DiskCacheFilename property. - /// \code - /// axMap1.Tiles.DiskCacheFilename = "D:\tiles_cache.db3"; - /// \endcode - /// If no file with such name exists it will be created automatically. Only one database can be used at a time.\n - /// - /// For both types of cache there is built-in mechanism to limit its size, under exceeding of which the oldest tiles will be removed to give space - /// for the more recent ones: - /// \code - /// axMap1.Tiles.set_MaxCacheSize(tkCacheType.RAM, 200.0); // size in MB; 100 by default - /// axMap1.Tiles.set_MaxCacheSize(tkCacheType.Disk, 500.0); // size in MB; 100 by default - /// \endcode - /// - /// To get information about the size and content of cache use: Tiles.get_CacheSize, Tiles.get_DiskCacheCount. To clear all the cache or only data for - /// particular zoom levels and providers use: Tiles.ClearCache, Tiles.ClearCache2.\n - /// - /// E. Functioning.\n\n - /// If map projection is compatible with server tiles are loaded automatically when map extents change and Tiles.Visible property is set to true. - /// AxMap.TilesLoaded event is fired when all tiles for particular extents are loaded. In case all tiles were found in cache the event will fire - /// immediately, otherwise - after execution of HTTP requests. If new extents were set for map before all HTTP request for previous set of tiles - /// were completed, AxMap.TilesLoaded event won't fire, tiles already requested will be added to the cache, but other pending requests will be discarded. - /// Internally to queue HTTP requests 2 thread pools are used. To identify potential problems HTTP requests can logged into file with - /// Tiles.StartLogRequests method.\n\n - /// The behaviour of tile services depend upon how server and map projection are related. Several cases are possible:\n\n - /// 1. Server and map projections are the same.\n - /// - tiles are displayed without scaling using original size (256 by 256 pixels); - /// - snapping to discrete zoom levels works on any change of extents (if AxMap.ZoomBehavior = zbTileLevels); - /// - examples: OpenStreetMap tiles and Google Mercator projection of the map. - /// - /// 2. Special case of: server projection is GMercator, map projection - WGS84.\n - /// - width of tiles will match the original, height will be equal (on equator) or smaller than original; - /// - snapping to discrete zoom levels works on any change of extents (if AxMap.ZoomBehavior = zbTileLevels); - /// - no gaps between tiles. - /// - /// 3. Server projection is local one (like Amersfoort/RD New), server projection is different:\n - /// - size of tiles will be adjusted to be as close to original as possible, but will vary for individual tiles; - /// - gaps between tiles, which gradually become smaller at close zoom levels; - /// - no automatic snapping to discrete zoom levels on changing extents. - /// - /// 4. Server projection is GMercator, map projection is some sort of local projection (like WGS84 UTM zones):\n - /// - the same behaviour as previous plus the following limitation; - /// - the smallest zoom levels (1-5) aren't available (can be changed with GlobalSettings.TilesMinZoomOnProjectionMismatch).\n\n - /// Instance of Tiles class associated with AxMap control is accessible via AxMap.Tiles property which is read-only. - /// \new490 Added in version 4.9.0 -#if nsp - #if upd - public class Tiles : MapWinGIS.ITiles - #else - public class ITiles - #endif -#else - public class Tiles -#endif - { - /// - /// Retrieves and applies proxy server settings (address and port) from IE settings - /// - /// True on success and false otherwise - public bool AutodetectProxy() - { - throw new NotImplementedException(); - } - - /// - /// Sends HTTP request to the specified address and reports back whether there is a response. - /// - /// The URL to send request to. - /// True if there is a connection (even if there is and error code like 404 in response) and false otherwise. - public bool CheckConnection(string url) - { - throw new NotImplementedException(); - } - - /// - /// Clears cache of the specified type. - /// - /// Type of cache to be cleared. - public void ClearCache(tkCacheType cacheType) - { - throw new NotImplementedException(); - } - - /// - /// Clears cache of the specified to type for a given provider and scales. - /// - /// Type of cache to be cleared. - /// Tile provider to be cleared. ProviderNone will clear tiles for all providers. - /// Minimal scale (zoom) to clear tiles for. - /// Maximum scale (zoom) to clear tiles for. - public void ClearCache2(tkCacheType cacheType, tkTileProvider Provider, int fromScale = 0, int toScale = 100) - { - throw new NotImplementedException(); - } - - /// - /// Gets zoom (scale) of tiles currently displayed on the map. - /// - /// Tile zooms are discrete, but the scale for Map control is continuous. - /// Therefore in most cases tiles of particular zoom will be somewhat additionally scaled to fit the map, - /// i.e. their display size on map won't be equal to the original 256 pixels. - public int CurrentZoom - { - get { throw new NotImplementedException(); } - } - - /// - /// Restores the state of Tiles class from string. - /// - /// Serialized string generated by Tiles.Serialize method. - public void Deserialize(string newVal) - { - throw new NotImplementedException(); - } - - /// - /// Gets or sets the filename of SQLite database to cache tiles into. - /// - public string DiskCacheFilename - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets the bounds of specific tile in decimal degrees (for inner use/debug purposes). - /// - /// Id of the provider. - /// Zoom level for a tile. - /// X coordinate of the tile within zoom level. - /// Y coordinate of the tile within zoom level. - /// Bounds in decimal degrees or null on failure. - public Extents GetTileBounds(int ProviderId, int zoom, int tileX, int tileY) - { - throw new NotImplementedException(); - } - - /// - /// Gets indices of tiles within specified bounds in coordinates of the given zoom level. - /// - /// Bounds in decimal degrees. - /// Zoom level. - /// Id of the provider. - /// Extents object with tile bounds or null on failure. - /// Can be used at the first step of prefetching operation. - public Extents GetTilesIndices(Extents boundsDegrees, int zoom, int Provider) - { - throw new NotImplementedException(); - } - - /// - /// Gets or sets a value indicating whether a grid should be drawn to displayes borders of tiles (for debug purposes). - /// - public bool GridLinesVisible - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets or sets the maximum zoom (scale) to be cached if the automatic caching is chosen. - /// - /// The setting won't affect tile prefetching. - public int MaxScaleToCache - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets or sets the minimum zoom (scale) to be cached if the automatic caching is chosen. - /// - /// The setting won't affect tile prefetching. - public int MinScaleToCache - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Caches tiles of the specified provider within specified geographic bounds - /// to SQLite database for further offline use. - /// - /// Minimal latitude to cache within. - /// Maximum latitude to cache within. - /// Minimal longitude to cache within. - /// Maximum longitude to cache within. - /// Zoom level. - /// Id of the provider. - /// StopExecution interface implementation to stop the operation prematurely. - /// The number of tiles scheduled for caching. - /// The operation is executed asynchronously. To get the progress information use Tiles.GlobalCallback property. - /// The callback will returned the number of tiles already downloaded. When operation is completed, -1 will be returned. - public int Prefetch(double minLat, double maxLat, double minLng, double maxLng, int zoom, int ProviderId, IStopExecution stop) - { - throw new NotImplementedException(); - } - - /// - /// Caches tiles of the specified provider to SQLite database for further offline use. - /// - /// Minimum X index of tile to be cached (in coordinates of tile zoom level). - /// Maximum X index of tile to be cached (in coordinates of tile zoom level). - /// Minimum Y index of tile to be cached (in coordinates of tile zoom level). - /// Maximum Y index of tile to be cached (in coordinates of tile zoom level). - /// Zoom level to be cached. - /// Id of the provider. - /// StopExecution interface implementation to stop the operation prematurely. - /// Number of tiles scheduled for caching. - /// The operation is executed asynchronously. See details in Tiles.Prefetch. - public int Prefetch2(int minX, int maxX, int minY, int maxY, int zoom, int ProviderId, IStopExecution stop) - { - throw new NotImplementedException(); - } - - /// - /// Caches tiles to the specified file system folder for further offline use. - /// - /// Extents to cache within in decimal degrees. - /// Zoom level. - /// Id of the provider. - /// Directory to save files into. Nested folders for zoom levels, - /// X/Y coordinates will be created automatically. - /// File extension to store tiles with. - /// StopExecution interface implementation to stop the operation prematurely. - /// Number of tiles scheduled for caching. - /// Often tiles are saved with fictitious extension, like png.tile, - /// to avoid their listing in the gallery of smartphones for example. Tile consuming application often may be configured - /// to handle such extensions. - /// The operation is executed asynchronously. See details in Tiles.Prefetch. - public int PrefetchToFolder(Extents ext, int zoom, int ProviderId, string savePath, string fileExt, IStopExecution stop) - { - throw new NotImplementedException(); - } - - /// - /// Gets or sets active provider to serve the tiles. - /// - /// The property will return ProviderCustom for custom provider and - /// won't be able to set a custom provider (use Tiles.ProviderId to do it). - public tkTileProvider Provider - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets or sets active provider to server the tiles. Ids of both default and custom providers can be specified. - /// - public int ProviderId - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets the name of the active provider. - /// - public string ProviderName - { - get { throw new NotImplementedException(); } - } - - /// - /// Gets list of the available default and custom tile providers. - /// - public TileProviders Providers - { - get { throw new NotImplementedException(); } - } - - /// - /// Gets proxy server settings for tiles class including IP and port, e.g. 192.168.0.1:80. - /// - public string Proxy - { - get { throw new NotImplementedException(); } - } - - /// - /// Serializes the state of the Tiles class to be restored later with Tiles.Deserialize method. - /// - /// Serialized string. - public string Serialize() - { - throw new NotImplementedException(); - } - - /// - /// Set proxy server for tiles class. - /// - /// IP address of proxy. - /// Port to be used. - /// True on success and false otherwise. - public bool SetProxy(string address, int port) - { - throw new NotImplementedException(); - } - - /// - /// Gets or sets the amount of time in milliseconds a worker thread will sleep before the next HTTP request. - /// - /// In some cases rapid caching of tiles can enact certain blocking logic for the IP address by server or one of the proxies. - /// \new491 Added in version 4.9.1 - public int SleepBeforeRequestTimeout - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets or sets a value indicating whether server requests will be made to get the tiles. - /// - /// When set to false tiles will only be loaded from cache. - public bool UseServer - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets or sets a value indicating whether the tiles will be displayed on the map. - /// - /// When set to false tiles won't be requested either from server or cache. - public bool Visible - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets the current size of cache. - /// - /// The type of cache to return size for. - /// The size of cache in MB. - public double get_CacheSize(tkCacheType cacheType) - { - throw new NotImplementedException(); - } - - /// - /// Gets the current size of cache used for specific provider and zoom level. - /// - /// The type of cache to return size for. - /// Provider. ProviderNone will return size for all providers. - /// Scale (zoom) level. -1 will return size for all zoom levels. - /// The size of cache in MB. - public double get_CacheSize2(tkCacheType cacheType, tkTileProvider Provider = tkTileProvider.ProviderNone, int scale = -1) - { - throw new NotImplementedException(); - } - - /// - /// Gets the value indicating whether tiles requested from server will be automatically cached. - /// - /// The type of cache to be used. - /// True if automatic caching is on. - public bool get_DoCaching(tkCacheType cacheType) - { - throw new NotImplementedException(); - } - - /// - /// Sets the value indicating whether tiles requested from server will be automatically cached. - /// - /// The type of cache to be used. - /// True to turn automatic caching on. - public void set_DoCaching(tkCacheType cacheType, bool pVal) - { - throw new NotImplementedException(); - } - - /// - /// Gets the maximum allowable size of cache. - /// - /// The type of cache. - /// Maximum size in MB. - public double get_MaxCacheSize(tkCacheType cacheType) - { - throw new NotImplementedException(); - } - - /// - /// Sets the maximum allowable size of cache. - /// - /// The type of cache. - /// Maximum size in MB. - public void set_MaxCacheSize(tkCacheType cacheType, double pVal) - { - throw new NotImplementedException(); - } - - /// - /// Gets a value indicating whether specific type of cache should be used to display tiles. - /// - /// The type of cache. - /// True if the specific type of cache can be used. - public bool get_UseCache(tkCacheType cacheType) - { - throw new NotImplementedException(); - } - - /// - /// Sets a value indicating whether specific type of cache should be used to display tiles. - /// - /// The type of cache. - /// True if the specific type of cache can be used. - public void set_UseCache(tkCacheType cacheType, bool pVal) - { - throw new NotImplementedException(); - } - - /// - /// Gets or sets a value indicating whether log will include all HTTP requests or only unsuccessful ones. - /// - /// \new491 Added in version 4.9.1 - public bool LogErrorsOnly - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets filename to write log into. - /// - /// \new491 Added in version 4.9.1 - public string LogFilename - { - get { throw new NotImplementedException(); } - } - - /// - /// Gets a value indicating whether logging of HTTP requests will be performed. - /// - /// \new491 Added in version 4.9.1 - public bool LogIsOpened - { - get { throw new NotImplementedException(); } - } - - /// - /// Starts logging HTTP requests for tile server. - /// - /// Filename to write log into. New file will be created any existing file - overwritten. - /// Indicate whether only unsuccessful requests should logged. - /// True if log was opened, and false on failure. - /// \new491 Added in version 4.9.1 - public bool StartLogRequests(string Filename, bool errorsOnly = false) - { - throw new NotImplementedException(); - } - - /// - /// Stops logging of HTTP requests to a file. - /// - /// \new491 Added in version 4.9.1 - public void StopLogRequests() - { - throw new NotImplementedException(); - } - - /// - /// Gets the number of unsuccessful HTTP requests during prefetching operation (Tiles.Prefetch and overloads). - /// - /// \new491 Added in version 4.9.1 - public int PrefetchErrorCount - { - get { throw new NotImplementedException(); } - } - - /// - /// Gets the total number of requests carried out during prefetching operation. - /// - /// \new491 Added in version 4.9.1 - public int PrefetchTotalCount - { - get { throw new NotImplementedException(); } - } - - /// - /// Clears information about prefetching errors. - /// - /// \new491 Added in version 4.9.1 - public void ClearPrefetchErrors() - { - throw new NotImplementedException(); - } - - /// - /// Gets number of tiles stored in disk cache for a given provider, zoom and region. - /// - /// Id of provider. - /// Zoom level. - /// Min X index of tile. - /// Max X index of tile. - /// Min Y index of tile. - /// Max Y index of tile. - /// Number of tiles. - public int get_DiskCacheCount(int Provider, int zoom, int xMin, int xMax, int yMin, int yMax) - { - throw new NotImplementedException(); - } - - /// - /// Gets or sets a Callback object which handles progress and error messages. - /// - /// \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - public ICallback GlobalCallback - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// A text string associated with object. Any value can be stored by developer in this property. - /// - public string Key - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - /// Gets the code of last error which took place inside this object. - /// - public int LastErrorCode - { - get { throw new NotImplementedException(); } - } - - /// - /// Gets the description of the specific error code. - /// - /// The error code returned by LastErrorCode property. - /// String with the description. - public string get_ErrorMsg(int ErrorCode) - { - throw new NotImplementedException(); - } - - /// - /// Gets maximum available zoom level for the current provider. - /// - /// \new491 Added in version 4.9.1 - public int MaxZoom - { - get { throw new NotImplementedException(); } - } - - /// - /// Gets minimum available zoom level for the current provider. - /// - /// \new491 Added in version 4.9.1 - public int MinZoom - { - get { throw new NotImplementedException(); } - } - - /// - /// Get information about whether map projection and tile projection match. - /// - /// This diagnostic value indicates whether tiles will be rendered without scaling and distortions and if they will be rendered at all. - /// \new491 Added in version 4.9.1 - public tkTilesProjectionStatus ProjectionStatus - { - get { throw new NotImplementedException(); } - } - - /// - /// Gets projection used by specific tile service. - /// - /// \new491 Added in version 4.9.1 - public tkTileProjection ServerProjection - { - get { throw new NotImplementedException(); } - } - - /// - /// Clears user name and password set by Tiles.SetProxyAuthorization method. - /// - /// \new493 Added in version 4.9.3 - public void ClearProxyAuthorization() - { - throw new NotImplementedException(); - } - - /// - /// Sets credentials for proxy authorization. - /// - /// HTTP client will use this credentials when 401 or 407 response is received for original request: - /// http://msdn.microsoft.com/en-us/library/7shxzbwb%28v=vs.80%29.aspx - /// Username. - /// Password. - /// Domain name. - /// True on success. - /// \new493 Added in version 4.9.3 - public bool SetProxyAuthorization(string username, string password, string domain) - { - throw new NotImplementedException(); - } - } -#if nsp -} -#endif +{ +#endif + /// \anchor a_tiles + /// + /// Downloads and displays data from online TMS tile services, like OpenStreetMap. + /// + /// \attention MapWinGIS doesn't grant you any legal rights to use data from + /// particular online services. Please look for license information on acceptable usages of the data + /// on official sites of these services. + /// + /// Online tile services provide 2D maps of Earth surface, which are split into small parts (usually 256 by 256 pixels) called tiles. Tiles are + /// provided at a number of zoom levels with greater detail on each subsequent level. Typically there are about 15-20 zoom levels with just 4 tiles + /// for the whole Earth surface on the first one, and 4^zoom on subsequent levels. Depending on service the maps can be: + /// - synthetic: features of Earth surface are displayed with some arbitrary set of symbols (OpenStreetMap, GoogleMaps); + /// - satellite: satellite imagery (Bing satellite, Google satellite); + /// - hybrid: labels and objects displayed on top of satellite map. + /// + /// To get more information on tiles services see specification: here.\n + /// + /// A. Coordinate system and projection.\n\n + /// In order to display tiles from online datasource the coordinate system & projection of server must match or at least be compatible with those + /// settings for the map control. Three scenarios are possible: + /// \dot + /// digraph tiles_projection { + /// splines = true; + /// ranksep = 0.15; + /// nodesep = 0.5; + /// node [shape = oval, peripheries = 1, fontname=Helvetica, fontsize=9, fillcolor = gray, color = "gray", style = filled, height = 0.3, width = 0.8]; + /// render [ label="Tiles projection scenarios"]; + /// + /// node [shape = "note", width = 0.3, height = 0.3, peripheries = 1 fillcolor = "khaki" ] + /// s1 [label=" Projections match\l"]; + /// s2 [label=" Projections are compatible\l"]; + /// s3 [label=" Not compatible or no projection for the map\l"]; + /// + /// edge [dir = none, arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#808080" minlen=2 ] + /// render -> s1; + /// render -> s2; + /// render -> s3; + /// } + /// \enddot + /// \n + ///
+ /// 1) Projections match: tiles will be displayed in their native projection without distortions.\n\n + /// 2) Projections don't match but transformation from server projection to map projection is possible: tiles will be displayed with distortions, + /// which may be acceptable in some cases (spherical Mercator server projection, WGS84 map coordinate system) or hardly usable in others (spherical Mercator + /// server projection, UTM projection of WGS84 as map projection).\n\n + /// 3) No projections for map is set or map/server projections doesn't match and there is no transformation between them: tiles can't be displayed.\n + ///
+ /// Here are screenshots which illustrate types of distortions introduced by projection mismatch + /// (server projection is Spherical Mercator). + /// + ///
+ /// + /// + /// + /// + /// + /// + /// + /// + /// + ///
\image html tiles_wgs84.jpg\image html tiles_utm16.jpg
Spherical Mercator -> WGS84Spherical Mercator -> WGS84 UTM16
+ ///
+ /// To check whether map projection match the server one use Tiles.ProjectionStatus property.\n\n + /// Most tile servers like OpenStreetMap, GoogleMaps, etc. are using spherical Mercator projection (aka Google Mercator; EPSG 3857). Therefore in + /// most cases it may be set without additional checks: + /// \code + /// axMap1.Projection = tkMapProjection.PROJECTION_GOOGLE_MERCATOR; + /// \endcode + /// + /// B. Providers.\n + /// + /// MapWinGIS supports built-in default providers and custom providers. + /// \dot + /// digraph caching_types { + /// splines = true; + /// ranksep = 0.15; + /// nodesep = 0.5; + /// node [shape = oval, peripheries = 1, fontname=Helvetica, fontsize=9, fillcolor = gray, color = "gray", style = filled, height = 0.3, width = 0.8]; + /// render [ label="Tile providers"]; + /// + /// node [shape = "note", width = 0.3, height = 0.3, peripheries = 1 fillcolor = "khaki" ] + /// s1 [label=" Default built-in\l"]; + /// s2 [label=" Custom configured by user\l"]; + /// + /// edge [dir = none, arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#808080" minlen=2 ] + /// render -> s1; + /// render -> s2; + /// } + /// \enddot + /// + /// MapWinGIS has a number of built-in providers defined in tkTileProvider enumeration. To activate one of those use: + /// \code + /// axMap1.Tiles.Provider = tkTileProvider.OpenCycleMap; + /// // or a shorter version + /// axMap1.TileProvider = tkTileProvider.OpenCycleMap; + /// \endcode + /// The default provider is OpenStreetMap. + /// + /// To display list of available providers and their settings: + /// \code + /// TileProviders providers = axMap1.Tiles.Providers; + /// for (int i = 0; i < providers.Count; i++) + /// { + /// Debug.WriteLine("Provider name: " + providers.get_Name(i)); + /// Debug.WriteLine("Provider type: " + (providers.get_IsCustom(i) ? "custom" : "default")); + /// Debug.WriteLine("Min zoom: " + providers.get_MinZoom(i)); + /// Debug.WriteLine("Min zoom: " + providers.get_MinZoom(i)); + /// Debug.WriteLine("-----------------------------------"); + /// } + /// \endcode + /// + /// To add a custom provider to the list (in this example OpenStreetMap is configured as custom provider): + /// \code + /// TileProviders providers = axMap1.Tiles.Providers; + /// int providerId = (int)tkTileProvider.ProviderCustom + 1; // (1024 + 1) should be unique across application runs in case disk caching is used + /// providers.Add(providerId, "Custom TMS provider", + /// "https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png", + /// tkTileProjection.SphericalMercator, 0, 18); + /// \endcode + /// The following placeholders can be used: + /// - "{zoom}", "{x}", "{y}" will be substituted with value for particular tiles to form HTTP request; + /// - "{switch:a,b,c}" will randomly choose one of the comma separated values, thus switching between URLs of servers. + /// + /// To set this provider as an active one: + /// \code + /// axMap1.Tiles.ProviderId = providerId; + /// // the same property can be used to set default providers as well + /// // because enumerated constant values match their id: + /// axMap1.Tiles.ProviderId = (int)tkTileProvider.OpenStreetMap; + /// \endcode + /// + /// To retrieve custom provider already added to the list: + /// \code + /// int providerId = 1025; // id of provider passed to TileProviders.Add method + /// TileProviders providers = axMap1.Tiles.Providers; + /// int index = providers.get_IndexByProviderId(providerId); + /// Debug.WriteLine("The recently added custom provider is: " + providers.get_Name(index)); + /// \endcode + /// It's necessary to distinguish unique providerId passed to TileProviders.Add method and used by caching mechanism, + /// and index of provider in TileProviders collection which may differ across application runs. + /// To get index in collection by providerId use TileProviders.get_IndexByProviderId. + /// + /// C. Zoom levels.\n\n + /// Originally MapWinGIS doesn't support concept of discrete zoom levels and can display any arbitrary zoom level between those defined by tile + /// service. This will lead to scaling of tiles, i.e. separate images will be drawn + /// using size other than their original (256 by 256 pixels), which may decrease their readability. To force MapWinGIS to display tiles without + /// scaling set: + /// \code + /// axMap1.ZoomBehavior = zmUseTileLevels; + /// \endcode + /// Map can also be zoomed to particular tile level: + /// \code + /// axMap1.ZoomToTileLevel(10); + /// // or + /// axMap1.CurrentZoom = 10; // available from Form designer + /// \endcode + /// Zoom levels supported by active provider can be accessed via Tiles.MinZoom, Tiles.MaxZoom properties: + /// \code + /// Debug.WriteLine(string.Format("Provider {0} supports zoom levels from {1} to {2}", axMap1.Tiles.Provider.ToString(), + /// axMap1.Tiles.MinZoom, axMap1.Tiles.MaxZoom)); + /// \endcode + /// Available zoom levels for other providers can be retrieved via: TileProviders.get_MaxZoom, TileProviders.get_MinZoom. + /// Visibility of data layers displayed on the map can set for specific zoom levels only with: AxMap.set_LayerMaxVisibleZoom, + /// AxMap.set_LayerMaxVisibleZoom. + /// + /// D. Caching.\n\n + /// To speed up the display and reduce network traffic it's common to use caching for tiles, i.e. save them locally for further reuse. + /// MapWinGIS supports 2 types of tile cache: + /// - RAM cache: tiles are stored in memory (is on by default); + /// - disk cache: tiles are stored in SQLite database (by default existing database is used but no new tiles are written to it). + /// + /// \dot + /// digraph caching_types { + /// splines = true; + /// ranksep = 0.15; + /// nodesep = 0.5; + /// node [shape = oval, peripheries = 1, fontname=Helvetica, fontsize=9, fillcolor = gray, color = "gray", style = filled, height = 0.3, width = 0.8]; + /// render [ label="Caching types"]; + /// + /// node [shape = "note", width = 0.3, height = 0.3, peripheries = 1 fillcolor = "khaki" ] + /// s1 [label=" RAM caching\l"]; + /// s2 [label=" Disk caching (SQLite)\l"]; + /// + /// edge [dir = none, arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#808080" minlen=2 ] + /// render -> s1; + /// render -> s2; + /// } + /// \enddot + /// + /// To enable cache usage: + /// \code + /// axMap1.Tiles.set_UseCache(tkCacheType.Disk, true); // is on by default + /// axMap1.Tiles.set_UseCache(tkCacheType.RAM, true); // is on by default + /// \endcode + /// + /// To make MapWinGIS add newly downloaded tiles to cache: + /// \code + /// axMap1.Tiles.set_DoCaching(tkCacheType.RAM, true); // is on by default + /// axMap1.Tiles.set_DoCaching(tkCacheType.Disk, true); // if off by default + /// \endcode + /// + /// At this point new SQLite database will created to store tiles if it wasn't created so far. Default filename is mwtiles.db3. + /// Location - the folder with application executable. To change location of disk cache use Tiles.DiskCacheFilename property. + /// \code + /// axMap1.Tiles.DiskCacheFilename = "D:\tiles_cache.db3"; + /// \endcode + /// If no file with such name exists it will be created automatically. Only one database can be used at a time.\n + /// + /// For both types of cache there is built-in mechanism to limit its size, under exceeding of which the oldest tiles will be removed to give space + /// for the more recent ones: + /// \code + /// axMap1.Tiles.set_MaxCacheSize(tkCacheType.RAM, 200.0); // size in MB; 100 by default + /// axMap1.Tiles.set_MaxCacheSize(tkCacheType.Disk, 500.0); // size in MB; 100 by default + /// \endcode + /// + /// To get information about the size and content of cache use: Tiles.get_CacheSize, Tiles.get_DiskCacheCount. To clear all the cache or only data for + /// particular zoom levels and providers use: Tiles.ClearCache, Tiles.ClearCache2.\n + /// + /// E. Functioning.\n\n + /// If map projection is compatible with server tiles are loaded automatically when map extents change and Tiles.Visible property is set to true. + /// AxMap.TilesLoaded event is fired when all tiles for particular extents are loaded. In case all tiles were found in cache the event will fire + /// immediately, otherwise - after execution of HTTP requests. If new extents were set for map before all HTTP request for previous set of tiles + /// were completed, AxMap.TilesLoaded event won't fire, tiles already requested will be added to the cache, but other pending requests will be discarded. + /// Internally to queue HTTP requests 2 thread pools are used. To identify potential problems HTTP requests can logged into file with + /// Tiles.StartLogRequests method.\n\n + /// The behaviour of tile services depend upon how server and map projection are related. Several cases are possible:\n\n + /// 1. Server and map projections are the same.\n + /// - tiles are displayed without scaling using original size (256 by 256 pixels); + /// - snapping to discrete zoom levels works on any change of extents (if AxMap.ZoomBehavior = zbTileLevels); + /// - examples: OpenStreetMap tiles and Google Mercator projection of the map. + /// + /// 2. Special case of: server projection is GMercator, map projection - WGS84.\n + /// - width of tiles will match the original, height will be equal (on equator) or smaller than original; + /// - snapping to discrete zoom levels works on any change of extents (if AxMap.ZoomBehavior = zbTileLevels); + /// - no gaps between tiles. + /// + /// 3. Server projection is local one (like Amersfoort/RD New), server projection is different:\n + /// - size of tiles will be adjusted to be as close to original as possible, but will vary for individual tiles; + /// - gaps between tiles, which gradually become smaller at close zoom levels; + /// - no automatic snapping to discrete zoom levels on changing extents. + /// + /// 4. Server projection is GMercator, map projection is some sort of local projection (like WGS84 UTM zones):\n + /// - the same behaviour as previous plus the following limitation; + /// - the smallest zoom levels (1-5) aren't available (can be changed with GlobalSettings.TilesMinZoomOnProjectionMismatch).\n\n + /// Instance of Tiles class associated with AxMap control is accessible via AxMap.Tiles property which is read-only. + /// \new490 Added in version 4.9.0 +#if nsp +#if upd + public class Tiles : MapWinGIS.ITiles +#else + public class ITiles +#endif +#else + public class Tiles +#endif + { + private GeoProjection _serverProjection = new GeoProjection(); + + /// + /// Retrieves and applies proxy server settings (address and port) from IE settings + /// + /// True on success and false otherwise + public bool AutodetectProxy() + { + throw new NotImplementedException(); + } + + /// + /// Sends HTTP request to the specified address and reports back whether there is a response. + /// + /// The URL to send request to. + /// True if there is a connection (even if there is and error code like 404 in response) and false otherwise. + public bool CheckConnection(string url) + { + throw new NotImplementedException(); + } + + /// + /// Clears cache of the specified type. + /// + /// Type of cache to be cleared. + public void ClearCache(tkCacheType cacheType) + { + throw new NotImplementedException(); + } + + /// + /// Clears cache of the specified to type for a given provider ID and scales. + /// + /// Type of cache to be cleared. + /// Tile provider ID to be cleared. -1 will clear tiles for all providers. + /// Minimal scale (zoom) to clear tiles for. + /// Maximum scale (zoom) to clear tiles for. + public void ClearCache2(tkCacheType cacheType, int providerId, int fromScale = 0, int toScale = 100) + { + throw new NotImplementedException(); + } + + /// + /// Clears cache of the specified to type for a given provider and scales. + /// + /// Type of cache to be cleared. + /// Tile provider to be cleared. ProviderNone will clear tiles for all providers. + /// Minimal scale (zoom) to clear tiles for. + /// Maximum scale (zoom) to clear tiles for. + public void ClearCache2(tkCacheType cacheType, tkTileProvider provider, int fromScale = 0, int toScale = 100) + { + throw new NotImplementedException(); + } + + /// + /// Gets zoom (scale) of tiles currently displayed on the map. + /// + /// Tile zooms are discrete, but the scale for Map control is continuous. + /// Therefore in most cases tiles of particular zoom will be somewhat additionally scaled to fit the map, + /// i.e. their display size on map won't be equal to the original 256 pixels. + public int CurrentZoom + { + get { throw new NotImplementedException(); } + } + + /// + /// Gets or sets the delay request timeout. + /// + public int DelayRequestTimeout { get; set; } + + /// + /// Restores the state of Tiles class from string. + /// + /// Serialized string generated by Tiles.Serialize method. + public void Deserialize(string newVal) + { + throw new NotImplementedException(); + } + + /// + /// Gets or sets the filename of SQLite database to cache tiles into. + /// + public string DiskCacheFilename + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// Gets the bounds of specific tile in decimal degrees (for inner use/debug purposes). + /// + /// Id of the provider. + /// Zoom level for a tile. + /// X coordinate of the tile within zoom level. + /// Y coordinate of the tile within zoom level. + /// Bounds in decimal degrees or null on failure. + public MapWinGIS.Extents GetTileBounds(int providerId, int zoom, int tileX, int tileY) + { + throw new NotImplementedException(); + } + + /// + /// Gets indices of tiles within specified bounds in coordinates of the given zoom level. + /// + /// Bounds in decimal degrees. + /// Zoom level. + /// Id of the provider. + /// Extents object with tile bounds or null on failure. + /// Can be used at the first step of prefetching operation. + public Extents GetTilesIndices(Extents boundsDegrees, int zoom, int providerId) + { + throw new NotImplementedException(); + } + + /// + /// Gets or sets a value indicating whether a grid should be drawn to displayes borders of tiles (for debug purposes). + /// + public bool GridLinesVisible + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// Gets or sets the maximum zoom (scale) to be cached if the automatic caching is chosen. + /// + /// The setting won't affect tile prefetching. + public int MaxScaleToCache + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// Gets or sets the minimum zoom (scale) to be cached if the automatic caching is chosen. + /// + /// The setting won't affect tile prefetching. + public int MinScaleToCache + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// Caches tiles of the specified provider within specified geographic bounds + /// to SQLite database for further offline use. + /// + /// Minimal latitude to cache within. + /// Maximum latitude to cache within. + /// Minimal longitude to cache within. + /// Maximum longitude to cache within. + /// Zoom level. + /// Id of the provider. + /// StopExecution interface implementation to stop the operation prematurely. + /// The number of tiles scheduled for caching. + /// The operation is executed asynchronously. To get the progress information use Tiles.GlobalCallback property. + /// The callback will returned the number of tiles already downloaded. When operation is completed, -1 will be returned. + public int Prefetch(double minLat, double maxLat, double minLng, double maxLng, int zoom, int providerId, IStopExecution stop) + { + throw new NotImplementedException(); + } + + /// + /// Caches tiles of the specified provider to SQLite database for further offline use. + /// + /// Minimum X index of tile to be cached (in coordinates of tile zoom level). + /// Maximum X index of tile to be cached (in coordinates of tile zoom level). + /// Minimum Y index of tile to be cached (in coordinates of tile zoom level). + /// Maximum Y index of tile to be cached (in coordinates of tile zoom level). + /// Zoom level to be cached. + /// Id of the provider. + /// StopExecution interface implementation to stop the operation prematurely. + /// Number of tiles scheduled for caching. + /// The operation is executed asynchronously. See details in Tiles.Prefetch. + public int Prefetch2(int minX, int maxX, int minY, int maxY, int zoom, int providerId, IStopExecution stop) + { + throw new NotImplementedException(); + } + + /// + /// Caches tiles to the specified file system folder for further offline use. + /// + /// Extents to cache within in decimal degrees. + /// Zoom level. + /// Id of the provider. + /// Directory to save files into (must exists). Nested folders for zoom levels, + /// X/Y coordinates will be created automatically. + /// File extension to store tiles with. + /// StopExecution interface implementation to stop the operation prematurely. + /// Number of tiles scheduled for caching. + /// Often tiles are saved with fictitious extension, like png.tile, + /// to avoid their listing in the gallery of smartphones for example. Tile consuming application often may be configured + /// to handle such extensions. + /// The operation is executed asynchronously. See details in Tiles.Prefetch. + public int PrefetchToFolder(Extents ext, int zoom, int providerId, string savePath, string fileExt, IStopExecution stop) + { + throw new NotImplementedException(); + } + + /// + /// Gets or sets active provider to serve the tiles. + /// + /// The property will return ProviderCustom for custom provider and + /// won't be able to set a custom provider (use Tiles.ProviderId to do it). + public tkTileProvider Provider + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// Gets or sets active provider to server the tiles. Ids of both default and custom providers can be specified. + /// + public int ProviderId + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// Gets the name of the active provider. + /// + public string ProviderName + { + get { throw new NotImplementedException(); } + } + + /// + /// Gets list of the available default and custom tile providers. + /// + public TileProviders Providers + { + get { throw new NotImplementedException(); } + } + + /// + /// Gets the current size of cache. + /// + /// The type of cache to return size for. + /// The size of cache in MB. + public double get_CacheSize(tkCacheType cacheType) + { + throw new NotImplementedException(); + } + + /// + /// Gets the current size of cache used for specific provider and zoom level. + /// + /// The type of cache to return size for. + /// Provider. ProviderNone will return size for all providers. + /// Scale (zoom) level. -1 will return size for all zoom levels. + /// The size of cache in MB. + public double get_CacheSize2(tkCacheType cacheType, tkTileProvider provider = tkTileProvider.ProviderNone, int scale = -1) + { + throw new NotImplementedException(); + } + + /// + /// Gets the current size of cache used for specific provider and zoom level. + /// + /// Type of the cache. + /// The provider. -1 will return size for all providers. + /// The scale. -1 will return size for all zoom levels. + /// The size of cache in MB. + public double get_CacheSize2(tkCacheType cacheType, int providerId = -1, int scale = -1) + { + throw new NotImplementedException(); + } + + /// + /// Gets proxy server settings for tiles class including IP and port, e.g. 192.168.0.1:80. + /// + public string Proxy + { + get { throw new NotImplementedException(); } + } + + /// + /// Serializes the state of the Tiles class to be restored later with Tiles.Deserialize method. + /// + /// Serialized string. + public string Serialize() + { + throw new NotImplementedException(); + } + + /// + /// Set proxy server for tiles class. + /// + /// IP address of proxy. + /// Port to be used. + /// True on success and false otherwise. + public bool SetProxy(string address, int port) + { + throw new NotImplementedException(); + } + + /// + /// Gets or sets the amount of time in milliseconds a worker thread will sleep before the next HTTP request. + /// + /// In some cases rapid caching of tiles can enact certain blocking logic for the IP address by server or one of the proxies. + /// \new491 Added in version 4.9.1 + public int SleepBeforeRequestTimeout + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// Gets or sets a value indicating whether server requests will be made to get the tiles. + /// + /// When set to false tiles will only be loaded from cache. + public bool UseServer + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// Gets or sets a value indicating whether the tiles will be displayed on the map. + /// + /// When set to false tiles won't be requested either from server or cache. + public bool Visible + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// Gets the value indicating whether tiles requested from server will be automatically cached. + /// + /// The type of cache to be used. + /// True if automatic caching is on. + public bool get_DoCaching(tkCacheType cacheType) + { + throw new NotImplementedException(); + } + + /// + /// Sets the value indicating whether tiles requested from server will be automatically cached. + /// + /// The type of cache to be used. + /// True to turn automatic caching on. + public void set_DoCaching(tkCacheType cacheType, bool pVal) + { + throw new NotImplementedException(); + } + + /// + /// Gets the maximum allowable size of cache. + /// + /// The type of cache. + /// Maximum size in MB. + public double get_MaxCacheSize(tkCacheType cacheType) + { + throw new NotImplementedException(); + } + + /// + /// Sets the maximum allowable size of cache. + /// + /// The type of cache. + /// Maximum size in MB. + public void set_MaxCacheSize(tkCacheType cacheType, double pVal) + { + throw new NotImplementedException(); + } + + /// + /// Gets a value indicating whether specific type of cache should be used to display tiles. + /// + /// The type of cache. + /// True if the specific type of cache can be used. + public bool get_UseCache(tkCacheType cacheType) + { + throw new NotImplementedException(); + } + + /// + /// Sets a value indicating whether specific type of cache should be used to display tiles. + /// + /// The type of cache. + /// True if the specific type of cache can be used. + public void set_UseCache(tkCacheType cacheType, bool pVal) + { + throw new NotImplementedException(); + } + + /// + /// Gets or sets a value indicating whether log will include all HTTP requests or only unsuccessful ones. + /// + /// \new491 Added in version 4.9.1 + public bool LogErrorsOnly + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// Gets filename to write log into. + /// + /// \new491 Added in version 4.9.1 + public string LogFilename + { + get { throw new NotImplementedException(); } + } + + /// + /// Gets a value indicating whether logging of HTTP requests will be performed. + /// + /// \new491 Added in version 4.9.1 + public bool LogIsOpened + { + get { throw new NotImplementedException(); } + } + + /// + /// Starts logging HTTP requests for tile server. + /// + /// Filename to write log into. New file will be created, any existing file will be overwritten. + /// Indicate whether only unsuccessful requests should be logged. + /// True if log was opened, and false on failure. + /// \new491 Added in version 4.9.1 + //public bool StartLogRequests(string filename, bool errorsOnly = false) + //{ + // throw new NotImplementedException(); + //} + + /// + /// Stops logging of HTTP requests to a file. + /// + /// \new491 Added in version 4.9.1 + //public void StopLogRequests() + //{ + // throw new NotImplementedException(); + //} + + /// + /// Gets the number of unsuccessful HTTP requests during prefetching operation (Tiles.Prefetch and overloads). + /// + /// \new491 Added in version 4.9.1 + public int PrefetchErrorCount + { + get { throw new NotImplementedException(); } + } + + /// + /// Gets the total number of requests carried out during prefetching operation. + /// + /// \new491 Added in version 4.9.1 + public int PrefetchTotalCount + { + get { throw new NotImplementedException(); } + } + + /// + /// Clears information about prefetching errors. + /// + /// \new491 Added in version 4.9.1 + public void ClearPrefetchErrors() + { + throw new NotImplementedException(); + } + + /// + /// Gets number of tiles stored in disk cache for a given provider, zoom and region. + /// + /// Id of provider. + /// Zoom level. + /// Min X index of tile. + /// Max X index of tile. + /// Min Y index of tile. + /// Max Y index of tile. + /// Number of tiles. + public int get_DiskCacheCount(int providerId, int zoom, int xMin, int xMax, int yMin, int yMax) + { + throw new NotImplementedException(); + } + + /// + /// Gets or sets a Callback object which handles progress and error messages. + /// + /// \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + public ICallback GlobalCallback + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// A text string associated with object. Any value can be stored by developer in this property. + /// + public string Key + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + /// + /// Gets the code of last error which took place inside this object. + /// + public int LastErrorCode + { + get { throw new NotImplementedException(); } + } + + /// + /// Gets the description of the specific error code. + /// + /// The error code returned by LastErrorCode property. + /// String with the description. + public string get_ErrorMsg(int errorCode) + { + throw new NotImplementedException(); + } + + /// + /// Gets maximum available zoom level for the current provider. + /// + /// \new491 Added in version 4.9.1 + public int MaxZoom + { + get { throw new NotImplementedException(); } + } + + /// + /// Gets minimum available zoom level for the current provider. + /// + /// \new491 Added in version 4.9.1 + public int MinZoom + { + get { throw new NotImplementedException(); } + } + + /// + /// Get information about whether map projection and tile projection match. + /// + /// This diagnostic value indicates whether tiles will be rendered without scaling and distortions and if they will be rendered at all. + /// \new491 Added in version 4.9.1 + public tkTilesProjectionStatus ProjectionStatus + { + get { throw new NotImplementedException(); } + } + + /// + /// Gets or sets the proxy authentication scheme. + /// + /// \new491 Added in version 4.9.1 + public tkProxyAuthentication ProxyAuthenticationScheme { get; set; } + + /// + /// Gets a value indicating whether [projection is spherical mercator]. + /// + /// + /// true if [projection is spherical mercator]; otherwise, false. + /// + public bool ProjectionIsSphericalMercator { get; } + + /// + /// Gets projection used by specific tile service. + /// + /// \new491 Added in version 4.9.1 + public GeoProjection ServerProjection + { + get { return _serverProjection; } + } + + /// + /// Clears user name and password set by Tiles.SetProxyAuthentication method. + /// + /// \new493 Added in version 4.9.3 + public void ClearProxyAuthorization() + { + throw new NotImplementedException(); + } + + /// + /// Sets credentials for proxy authorization. + /// + /// HTTP client will use this credentials when 401 or 407 response is received for original request: + /// http://msdn.microsoft.com/en-us/library/7shxzbwb%28v=vs.80%29.aspx + /// Username. + /// Password. + /// Domain name. + /// True on success. + /// \new493 Added in version 4.9.3 + public bool SetProxyAuthentication(string username, string password, string domain) + { + throw new NotImplementedException(); + } + } +#if nsp +} +#endif diff --git a/docs/Interop.MapWinGIS/Com Classes/Tin.cs b/docs/Interop.MapWinGIS/Com Classes/Tin.cs index 52a98bf9..642b3858 100644 --- a/docs/Interop.MapWinGIS/Com Classes/Tin.cs +++ b/docs/Interop.MapWinGIS/Com Classes/Tin.cs @@ -186,6 +186,11 @@ public void Triangle(int TriIndex, out int vtx1Index, out int vtx2Index, out int throw new NotImplementedException(); } + public void min(out double x, out double y, out double Z) + { + throw new NotImplementedException(); + } + /// /// Gets the indices of the specified triangle's neighboring triangles in the TIN. /// @@ -210,6 +215,11 @@ public void Vertex(int VtxIndex, out double x, out double y, out double Z) throw new NotImplementedException(); } + public void max(out double x, out double y, out double Z) + { + throw new NotImplementedException(); + } + /// /// Retrieves the error message associated with the specified error code. /// diff --git a/docs/Interop.MapWinGIS/Com Classes/Utils.cs b/docs/Interop.MapWinGIS/Com Classes/Utils.cs index 7b6d057d..6f1f3c36 100644 --- a/docs/Interop.MapWinGIS/Com Classes/Utils.cs +++ b/docs/Interop.MapWinGIS/Com Classes/Utils.cs @@ -1,4 +1,4 @@ - +// ReSharper disable UnassignedGetOnlyAutoProperty #if nsp namespace MapWinGIS { @@ -6,18 +6,18 @@ namespace MapWinGIS using System; /// /// A utils object provides access to a set of utility functions to perform a variety of tasks on other objects such as grids, images, points, shapes, shapefiles, tins, etc. + /// Starting at v4.9.5 some specific GDAL methods are moved to GdalUtils. /// - #if nsp - #if upd - public class Utils : MapWinGIS.IUtils - #else - public class IUtils - #endif - #else +#if nsp +#if upd + public class Utils : MapWinGIS.IUtils +#else + public class IUtils +#endif +#else public class Utils - #endif +#endif { - #region IUtils Members /// /// Modifies a polygon using the specified method. /// @@ -66,8 +66,8 @@ public bool GenerateHillShade(string bstrGridFilename, string bstrShadeFilename, /// \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. public ICallback GlobalCallback { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } } /// @@ -315,7 +315,7 @@ public double get_Length(Shape Shape) { throw new NotImplementedException(); } - + /// /// Gets the perimeter of the polygon shape. /// @@ -358,7 +358,6 @@ public bool GenerateContour(string bstrSrcFilename, string bstrDstFilename, doub { throw new NotImplementedException(); } - #endregion /// /// Creates a new grid from the input one in which all values outside the specified polygon are set to no data value. @@ -472,6 +471,8 @@ public bool GDALRasterize(string bstrSrcFilename, string bstrDstFilename, string /// /// See documentation here: http://www.gdal.org/gdalwarp.html /// \new490 Added in version 4.9.0 + /// \deprecated v4.9.5 Use GdalUtils.GDALWarp instead. + [Obsolete("Use GdalUtils.GDALWarp")] public bool GDALWarp(string bstrSrcFilename, string bstrDstFilename, string bstrOptions, ICallback cBack = null) { throw new NotImplementedException(); @@ -490,7 +491,7 @@ public double GeodesicDistance(double lat1, double lng1, double lat2, double lng { throw new NotImplementedException(); } - + /// /// Calculates statistics for portion of grid that is overlapped by specified polygon. /// @@ -575,17 +576,19 @@ public bool MaskRaster(string Filename, byte newPerBandValue) { throw new NotImplementedException(); } - + /// /// The same as GDAL's ogr2ogr utility. /// /// See documentation here: http://www.gdal.org/ogr2ogr.html /// \new490 Added in version 4.9.0 + /// \deprecated v4.9.5 Use GdalUtils.GdalVectorTranslate instead. + [Obsolete("Use GdalUtils.GdalVectorTranslate")] public bool OGR2OGR(string bstrSrcFilename, string bstrDstFilename, string bstrOptions, ICallback cBack = null) { throw new NotImplementedException(); } - + /// /// The same as GDAL's OGRInfo utility. /// @@ -756,6 +759,32 @@ public bool IsTiffGrid(string Filename) throw new NotImplementedException(); } + public double GeodesicArea(Shape shapeWgs84) + { + throw new NotImplementedException(); + } + + public bool FixUpShapes(Shapefile subject, bool SelectedOnly, string outputFilename, bool Overwrite) + { + throw new NotImplementedException(); + } + + public bool BufferByDistance(Shapefile subject, double Distance, int nSegments, bool SelectedOnly, bool MergeResults, + string outputFilename, bool Overwrite) + { + throw new NotImplementedException(); + } + + public bool ExplodeShapes(Shapefile subject, bool SelectedOnly, string outputFilename, bool Overwrite) + { + throw new NotImplementedException(); + } + + public bool ExportSelection(Shapefile subject, string outputFilename, bool Overwrite) + { + throw new NotImplementedException(); + } + /// /// Gets the tkUnitsOfMeasure enumeration associated with the specified EPSG Unit Code /// diff --git a/docs/Interop.MapWinGIS/Enumerations/Enumerations.cs b/docs/Interop.MapWinGIS/Enumerations/Enumerations.cs index a3ec03cb..af58b1d6 100644 --- a/docs/Interop.MapWinGIS/Enumerations/Enumerations.cs +++ b/docs/Interop.MapWinGIS/Enumerations/Enumerations.cs @@ -35,6 +35,8 @@ public enum FieldType STRING_FIELD = 0, INTEGER_FIELD = 1, DOUBLE_FIELD = 2, + BOOLEAN_FIELD = 3, + DATE_FIELD = 4 } /// diff --git a/docs/Interop.MapWinGIS/Interop.MapWinGIS.csproj b/docs/Interop.MapWinGIS/Interop.MapWinGIS.csproj index 0248bfc8..d0030097 100644 --- a/docs/Interop.MapWinGIS/Interop.MapWinGIS.csproj +++ b/docs/Interop.MapWinGIS/Interop.MapWinGIS.csproj @@ -113,6 +113,7 @@ + @@ -150,7 +151,6 @@ - diff --git a/docs/Interop.MapWinGIS/Properties/AssemblyInfo.cs b/docs/Interop.MapWinGIS/Properties/AssemblyInfo.cs index 6fc6d55f..146c8ae8 100644 --- a/docs/Interop.MapWinGIS/Properties/AssemblyInfo.cs +++ b/docs/Interop.MapWinGIS/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Interop.MapWinGIS")] -[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyCopyright("Copyright © 2011-2018")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.0.0.*")] [assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/docs/Interop.MapWinGIS/Related Pages/Diagram description.cs b/docs/Interop.MapWinGIS/Related Pages/Diagram description.cs index 5ba2b147..c7e23b05 100644 --- a/docs/Interop.MapWinGIS/Related Pages/Diagram description.cs +++ b/docs/Interop.MapWinGIS/Related Pages/Diagram description.cs @@ -1,4 +1,5 @@ -/// \page diagrams Diagram description +#pragma warning disable 1587 +/// \page diagrams Diagram description /// /// \section one I. Pseudo class diagram. /// This diagram represents "contains" type of the relation between 2 classes, i.e. when an instance of the class @@ -48,4 +49,4 @@ /// cl -> gr3; /// } /// \enddot - +#pragma warning restore 1587 \ No newline at end of file diff --git a/docs/Interop.MapWinGIS/Related Pages/Getting started.cs b/docs/Interop.MapWinGIS/Related Pages/Getting started.cs index 33313d5f..fe816595 100644 --- a/docs/Interop.MapWinGIS/Related Pages/Getting started.cs +++ b/docs/Interop.MapWinGIS/Related Pages/Getting started.cs @@ -1,8 +1,9 @@ -/// \page getting_started Getting started with MapWinGIS 4.9.3 +#pragma warning disable 1587 +/// \page getting_started Getting started with MapWinGIS 4.9.3+ /// /// Let's start assuming that you: /// - Installed the latest 32-Bit version of MapWinGIS using the installer available on the -/// MapWinGIS site; +/// MapWinGIS GitHub site; /// - Created a new WinForms project in Visual Studio and have a new Form to add Map control to. /// /// \note You can create a 64-Bit version of you application and run it with the 64-Bit version of MapWinGIS, @@ -90,8 +91,8 @@ /// \image html intellisense2.jpg /// /// The latest versions of XML documentation for Interop assemblies can also be found in the repository: -/// Interop.MapWinGIS.xml -/// AxInterop.MapWinGIS.xml +/// Interop.MapWinGIS.xml +/// AxInterop.MapWinGIS.xml /// /// \section gs4 C. Default hotkeys. /// Map control uses the following built-in keyboard hotkeys: @@ -126,7 +127,7 @@ /// \endcode /// /// \section gs5 D. Measuring tool. -/// MapWinGIS has built-in measuing tool. To start measuring set in Properties window or in code: +/// MapWinGIS has built-in measuring tool. To start measuring set in Properties window or in code: /// \code /// axMap1.CursorMode = cmMeasure; /// \endcode @@ -199,14 +200,14 @@ /// \endcode /// /// \section gs7 F. Projection mismatch testing. -/// Adding of layer to the map may fail because of projection mismatch testing (GlobalSettings.AllowProjectMismatch). +/// Adding of layer to the map may fail because of projection mismatch testing (GlobalSettings.AllowProjectionMismatch). /// It's turned off by default (i.e. set to true; mismatch is allowed), /// so any layer will be added to the map even if its projection doesn't match. /// If projection mismatch testing is on and reprojection option is chosen (GlobalSettings.ReprojectLayersOnAdding), /// a copy of datasource may be created in AxMap.AddLayer. /// Any initialization logic in this case should be run after layer was added to the map. /// \code -/// new GlobalSettings() { AllowProjectMismatch = false, ReprojectLayersOnAdding = true }; +/// new GlobalSettings() { AllowProjectionMismatch = false, ReprojectLayersOnAdding = true }; /// var sf = new Shapefile(); /// if (sf.Open(filename, null)) /// { @@ -243,5 +244,4 @@ /// \endcode /// This will reset control's properties set in the designer, as outdated state information often /// becomes a source of problems. - - +#pragma warning restore 1587 \ No newline at end of file diff --git a/docs/Interop.MapWinGIS/Related Pages/Hints.cs b/docs/Interop.MapWinGIS/Related Pages/Hints.cs index 8ac2f529..424bfbd3 100644 --- a/docs/Interop.MapWinGIS/Related Pages/Hints.cs +++ b/docs/Interop.MapWinGIS/Related Pages/Hints.cs @@ -1,4 +1,5 @@ -/// \page hints Hints +#pragma warning disable 1587 +/// \page hints Hints /// /// A. COM objects. \n\n /// MapWinGIS is COM-based, therefore it counts the references of particular objects to determine when they are no longer needed and can be released. @@ -28,7 +29,7 @@ /// /// B. Error handling and progress information. \n\n /// By design MapWinGIS doesn't throw exceptions to return the information about errors. If an unhandled exception is still thrown, -/// in the most cases it should be treated as a bug and reported to the Issue tracker.\n +/// in the most cases it should be treated as a bug and reported to the Issue tracker.\n /// /// To notify a client about success or failure of certain method the following approaches are used: /// -# A boolean return value (for C++ it's VARIANT_BOOL* [out, retval] parameter); @@ -136,4 +137,5 @@ /// -# From version 4.8 (May 2011) MapWinGIS can load MapWindow 4 projects using AxMap.LoadMapState call. /// It provides the the fastest way to setup the visualization options for the layers and pass them to custom application. \n\n /// -# The functionality present in MapWindow can be more or less easily implemented in other custom application based on MapWinGIS. -/// MapWindow 4 repository is here. \ No newline at end of file +/// MapWindow 4 repository is here. +#pragma warning restore 1587 \ No newline at end of file diff --git a/docs/Interop.MapWinGIS/Related Pages/How to document further.cs b/docs/Interop.MapWinGIS/Related Pages/How to document further.cs index 2f3659ec..6f5f9e74 100644 --- a/docs/Interop.MapWinGIS/Related Pages/How to document further.cs +++ b/docs/Interop.MapWinGIS/Related Pages/How to document further.cs @@ -1,4 +1,5 @@ -/// \page documentation How to document further +#pragma warning disable 1587 +/// \page documentation How to document further /// /// Here is a brief overview of documentation project, doxygen tags and diagrams specification which were used to create this documentation. \n /// @@ -96,5 +97,4 @@ /// The output will be the following: /// \dotfile dot_tags.txt /// - - +#pragma warning restore 1587 \ No newline at end of file diff --git a/docs/Interop.MapWinGIS/Related Pages/Overview.cs b/docs/Interop.MapWinGIS/Related Pages/Overview.cs index 0958c726..0ec2e607 100644 --- a/docs/Interop.MapWinGIS/Related Pages/Overview.cs +++ b/docs/Interop.MapWinGIS/Related Pages/Overview.cs @@ -1,4 +1,5 @@ -/// \page overview Library Overview +#pragma warning disable 1587 +/// \page overview Library Overview /// /// \section overview_zero I. Specification. /// @@ -9,7 +10,8 @@ /// /// /// -/// +/// +/// ///
License: Mozilla Public License v.1.1. (http://www.mozilla.org/MPL/)
Functionality:data visualization and geoprocessing
Intended use:desktop applications with GIS functionality
Homepage:http://mapwingis.codeplex.com
Homepage:http://www.mapwindow.org
GitHub page:https://github.com/MapWindow/MapWinGIS
/// /// \section overview_nine II. Registration. @@ -78,8 +80,5 @@ /// PROJ.4Reprojection of data.http://proj.osgeo.orgstatic /// LibspatialindexThe file-based spatial index for ESRI shapefiles.http://libspatialindex.github.com/static /// -/// The binary versions of dlls can be found on the home pages of corresponding products or -/// here. \n -/// For those who want to build MapWinGIS from the source, the .lib files for the external libraries -/// can be downloaded here. \n /// +#pragma warning restore 1587 \ No newline at end of file diff --git a/docs/Interop.MapWinGIS/Related Pages/Start page.cs b/docs/Interop.MapWinGIS/Related Pages/Start page.cs index 7b6ce0c2..88e94f30 100644 --- a/docs/Interop.MapWinGIS/Related Pages/Start page.cs +++ b/docs/Interop.MapWinGIS/Related Pages/Start page.cs @@ -1,9 +1,10 @@ -/// \mainpage MapWinGIS ActiveX Control +#pragma warning disable 1587 +/// \mainpage MapWinGIS ActiveX Control /// /// \section content Main topics -/// - \link overview Library overview \endlink +/// - \link getting_started GETTING STARTED WITH v. 4.9.3+ \endlink /// - \link version_history Version history \endlink -/// - \link getting_started GETTING STARTED WITH v. 4.9.3 \endlink +/// - \link overview Library overview \endlink /// - \ref a_projection "Map projection" /// - Map control /// - Online tiles services @@ -32,4 +33,4 @@ /// /// \link documentation How to document further \endlink /// - +#pragma warning restore 1587 \ No newline at end of file diff --git a/docs/Interop.MapWinGIS/Related Pages/Version history.cs b/docs/Interop.MapWinGIS/Related Pages/Version history.cs index c32936c0..7ed69273 100644 --- a/docs/Interop.MapWinGIS/Related Pages/Version history.cs +++ b/docs/Interop.MapWinGIS/Related Pages/Version history.cs @@ -1,4 +1,5 @@ -/// \page version_history Version history +#pragma warning disable 1587 +/// \page version_history Version history /// /// \section apichanges API changes. /// - New API in version \link newpage495 4.9.5 \endlink @@ -118,7 +119,7 @@ /// but uses fast heuristic which can employ somewhat more colors than optimal solution /// (ShapefileCategories.GeneratePolygonColors). /// -/// 6. New OpenStreetMap Humanitarian tile provider. +/// 6. New OpenStreetMap Humanitarian tile provider. /// /// \section changes491 Changes in version 4.9.1. /// @@ -204,8 +205,4 @@ /// 15. New methods in %Shape class: /// - Shape.ClosestPoints: finds 2 closest points for any pair of shapes; /// - Shape.ImportFromWKT: imports data from WKT format. - - - - - +#pragma warning restore 1587 \ No newline at end of file diff --git a/docs/Interop.MapWinGIS/Related Pages/examples_list.cs b/docs/Interop.MapWinGIS/Related Pages/examples_list.cs index bff0ceb1..700e671a 100644 --- a/docs/Interop.MapWinGIS/Related Pages/examples_list.cs +++ b/docs/Interop.MapWinGIS/Related Pages/examples_list.cs @@ -1,3 +1,4 @@ +#pragma warning disable 1587 /// This example demonstrates how to create several buffers around the rivers. Four buffers are build sequentially, each of them as the separate shapefile.The overlapping shapes of each buffer are merged together. Then smaller buffers are subtracted from the larger ones, making "holes" in them. After it all 4 buffers are copied to a single shapefile with buffer distance field. Finally a color scheme ranging from blue to yellow is applied. An implementation of ICallback interface is used for reporting progress information. ///Here is a screenshot with the results of the code execution. /// \image html CreateBuffer.png @@ -145,4 +146,4 @@ ///Here is a screenshot with the results of the code execution. /// \image html TrackCars.png /// \example TrackCars.cs - +#pragma warning restore 1587 \ No newline at end of file diff --git a/docs/MapWinGIS doxyfile b/docs/MapWinGIS doxyfile deleted file mode 100644 index 6d1fa0a4..00000000 --- a/docs/MapWinGIS doxyfile +++ /dev/null @@ -1,1825 +0,0 @@ -# Doxyfile 1.7.6.1 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or sequence of words) that should -# identify the project. Note that if you do not use Doxywizard you need -# to put quotes around the project name if it contains spaces. - -PROJECT_NAME = MapWinGIS - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = output - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 7 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = "new48=\xrefitem newpage48 \"New API 4.8\" \"New API 4.8\"" \ - "new490=\xrefitem newpage490 \"New API 4.9.0\" \"New API 4.9.0\"" \ - "new491=\xrefitem newpage491 \"New API 4.9.1\" \"New API 4.9.1\"" \ - "new492=\xrefitem newpage492 \"New API 4.9.2\" \"New API 4.9.2\"" \ - "new493=\xrefitem newpage493 \"New API 4.9.3\" \"New API 4.9.3\"" \ - "new494=\xrefitem newpage494 \"New API 4.9.4\" \"New API 4.9.4\"" \ - "new495=\xrefitem newpage495 \"New API 4.9.5\" \"New API 4.9.5\"" \ - "removed493=\xrefitem removed493 \"Removed in 4.9.3\" \"Removed in 4.9.3\"" - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding -# "class=itcl::class" will allow you to use the command class in the -# itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this -# tag. The format is ext=language, where ext is a file extension, and language -# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, -# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions -# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = NO - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and -# unions with only public data fields will be shown inline in the documentation -# of the scope in which they are defined (i.e. file, namespace, or group -# documentation), provided this scope is documented. If set to NO (the default), -# structs, classes, and unions are shown on a separate page (for HTML and Man -# pages) or section (for LaTeX and RTF). - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penalty. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will roughly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols. - -SYMBOL_CACHE_SIZE = 0 - -# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be -# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given -# their name and scope. Since this can be an expensive process and often the -# same symbol appear multiple times in the code, doxygen keeps a cache of -# pre-resolved symbols. If the cache is too small doxygen will become slower. -# If the cache is too large, memory is wasted. The cache size is given by this -# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespaces are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = NO - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = YES - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = YES - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = YES - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = YES - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = NO - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = NO - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = NO - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 28 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = NO - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = NO - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. The create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. - -LAYOUT_FILE = DoxygenLayout.xml - -# The CITE_BIB_FILES tag can be used to specify one or more bib files -# containing the references data. This must be a list of .bib files. The -# .bib extension is automatically appended if omitted. Using this command -# requires the bibtex tool to be installed. See also -# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style -# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this -# feature you need bibtex and perl available in the search path. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.f90 \ - *.f \ - *.for \ - *.vhd \ - *.vhdl - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = Interop.MapWinGIS/Properties/AssemblyInfo.cs \ - Interop.MapWinGIS/Properties/Resources.Designer.cs \ - Interop.MapWinGIS/Properties/Settings.Designer.cs \ - Interop.MapWinGIS/examples \ - Examples \ - AxInterop.MapWinGIS/Properties/AssemblyInfo.cs - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = Examples/src - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = Resources/images - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if -# non of the patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. - -FILTER_SOURCE_PATTERNS = - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 2 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is advised to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when -# changing the value of configuration settings such as GENERATE_TREEVIEW! - -HTML_HEADER = header.html - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = footer.html - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# style sheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = doxygen.css - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the style sheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 219 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 75 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = YES - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) -# at top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. Since the tabs have the same information as the -# navigation tree you can set this option to NO if you already set -# GENERATE_TREEVIEW to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. -# Since the tree basically has the same information as the tab index you -# could consider to set DISABLE_INDEX to NO when enabling this option. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -ENUM_VALUES_PER_LINE = 4 - -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. - -USE_INLINE_TREES = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. - -USE_MATHJAX = NO - -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the -# mathjax.org site, so you can quickly see the result without installing -# MathJax, but it is strongly recommended to install a local copy of MathJax -# before deployment. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension -# names that should be enabled during MathJax rendering. - -MATHJAX_EXTENSIONS = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvantages are that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = NO - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4 - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! - -LATEX_FOOTER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -# The LATEX_BIB_STYLE tag can be used to specify the style to use for the -# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See -# http://en.wikipedia.org/wiki/BibTeX for more info. - -LATEX_BIB_STYLE = plain - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load style sheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition that -# overrules the definition found in the source code. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = YES - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will use the Helvetica font for all dot files that -# doxygen generates. When you want a differently looking font you can specify -# the font name using DOT_FONTNAME. You need to make sure dot is able to find -# the font, which can be done by putting it in a standard location or by setting -# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the -# directory containing the font. - -DOT_FONTNAME = Helvetica - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the Helvetica font. -# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to -# set the path where dot can find it. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = NO - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = YES - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = YES - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = YES - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will generate a graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, png, jpg, or gif. -# If left blank png will be used. If you choose svg you need to set -# HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible in IE 9+ (other browsers do not have this requirement). - -DOT_IMAGE_FORMAT = png - -# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to -# enable generation of interactive SVG images that allow zooming and panning. -# Note that this requires a modern browser other than Internet Explorer. -# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you -# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible. Older versions of IE do not have SVG support. - -INTERACTIVE_SVG = NO - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = "c:/Program Files (x86)/Graphviz 2.38/bin" - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = Resources/graphs - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). - -MSCFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = NO - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = NO diff --git a/docs/MapWinGIS.doxyfile b/docs/MapWinGIS.doxyfile new file mode 100644 index 00000000..c2c3a014 --- /dev/null +++ b/docs/MapWinGIS.doxyfile @@ -0,0 +1,2492 @@ +# Doxyfile 1.8.13 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = MapWinGIS + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = v4.9 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "MapWinGIS.ocx is used to provide GIS and mapping functionality to any Windows Forms based custom software application." + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = D:/dev/MapwinGIS/GitHub/docs/mapwingis_logo5-100px.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = output + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = NO + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 7 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = "new48=\xrefitem newpage48 \"New API 4.8\" \"New API 4.8\"" \ + "new490=\xrefitem newpage490 \"New API 4.9.0\" \"New API 4.9.0\"" \ + "new491=\xrefitem newpage491 \"New API 4.9.1\" \"New API 4.9.1\"" \ + "new492=\xrefitem newpage492 \"New API 4.9.2\" \"New API 4.9.2\"" \ + "new493=\xrefitem newpage493 \"New API 4.9.3\" \"New API 4.9.3\"" \ + "new494=\xrefitem newpage494 \"New API 4.9.4\" \"New API 4.9.4\"" \ + "new495=\xrefitem newpage495 \"New API 4.9.5\" \"New API 4.9.5\"" \ + "removed493=\xrefitem removed493 \"Removed in 4.9.3\" \"Removed in 4.9.3\"" + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = YES + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = NO + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = NO + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = NO + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = YES + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = YES + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = YES + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = YES + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = NO + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = NO + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = NO + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 28 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = DoxygenLayout.xml + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = . + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = Interop.MapWinGIS/Properties/AssemblyInfo.cs \ + Interop.MapWinGIS/Properties/Resources.Designer.cs \ + Interop.MapWinGIS/Properties/Settings.Designer.cs \ + Interop.MapWinGIS/examples \ + Examples \ + AxInterop.MapWinGIS/Properties/AssemblyInfo.cs + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = Examples/src + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = Resources/images + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = NO + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 2 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = header.html + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = footer.html + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = doxygen.css + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = mapwingis.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 219 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 75 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /
Here is a class diagram for the AxMap class: - \dot digraph map_diagram { + \dot + digraph map_diagram { nodesep = 0.3; ranksep = 0.3; splines = ortho; @@ -45,6 +46,30 @@ \dotfile mapgroups.dot Graph description + + + Gets or sets the user defined cursor handle. The handle is a windows cursor handle. + + + + + Gets or sets the object of Tiles class associated with map. + + \new490 Added in version 4.9.0 + + + + Gets FileManager object associated with map. The object is used by AxMap.AddLayerFromFilename methods. + + \new491 Added in version 4.9.1 + + + + Gets or sets the background color of the map. + + When using VB.NET the color is represented as a System.Drawing.Color. + When using VB 6 the color can be an OLE_COLOR or an integer representation of an RGB value. + Draws the content of the back buffer to specified device context. @@ -54,12 +79,42 @@ The width of the resulting image. The height of the resulting image. + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + .NET clients passing ICallback implementation to this property must make respective + class COM visible by setting ComVisible(true) attribute. In fact ComVisible(true) is set by default + for public classes, so it's enough to make sure that it isn't explicitly set to false for the class + or assembly where the class is defined. Otherwise InvalidCastException may occur at runtime. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + Returns the handle of the window of map control. The handle of window. + + + The key may be used by the programmer to store any string data associated with the object. + + + + + Retrieves the last error generated in the object. + + + + + Gets or sets the cursor used with the map. When using crsrUserDefined be sure to set a UDCursorHandle. + + + + + Gets or sets the value which indicates how the control adjust its content after the resizing operations. + + Redraws all layers in the map if the map is not locked. @@ -73,6 +128,13 @@ The new width of the control. The new hight of the control. + + + Gets or sets a value which indicates whether the time of map redraw will be displayed on the screen. + + Only times of full redraws when data layers are drawn anew are displayed. + \new48 Added in version 4.8 + Shows tooltip near the mouse cursor. @@ -80,6 +142,12 @@ Text of the tooltip. The duration of tooltip display. + + + Gets or sets a boolean value which indicate whether control's version number will be displayed on the screen. + + \new48 Added in version 4.8 + Takes snap shot of the contents of the map within the bounds of the specified rectangle, returning an image of the results. @@ -117,6 +185,12 @@ The width of the resulting image inShowVersionNumber pixels. True on success and false otherwise. + + + Gets or sets version number of the control. + + The set part of the property isn't supported. + Retrieves the error message associated with the specified error code. @@ -124,6 +198,14 @@ The error code for which the error message is required. The error message description for the specified error code. + + + Gets or sets tile provider for the map. + + This property is a shortcut for AxMap.Tiles.Provider property. + Setting it to ProviderNone will change AxMap.Tiles.Visible property to false. + \new491 Added in version 4.9.1 + Returns coordinate of the shapefile point closest to specified point on screen. @@ -166,6 +248,59 @@ altogether and call AxMap.Redraw instead ( equivalent to AxMap.Redraw2(tkRedrawType.RedrawAll)). \new491 Added in version 4.9.1 + + + Gets list actions performed by user via interactive shape editor. Provides undo/redo capability. + + \new493 Added in version 4.9.3 + + + + Gets an %Identifier object which holds settings of cmIdentify tools. + + \new493 Added in version 4.9.3 + + + + Gets instance of shape editor class associated with map which stores data entered by interactive editing tools. + + \new493 Added in version 4.9.3 + + + \addtogroup map_interaction Map interaction + Here is a list of properties and methods which affect the way a user interacts with the map. This module is a part of the documentation of AxMap class. + \dot + digraph map_interaction { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Map Interaction" URL="\ref map_interaction"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + + Gets or sets a boolean value which indicate whether map will be redrawn in the course of panning operation. + + The default value is false. Setting this value to true can improve the user experience but + decrease the performance in case large layers are displayed. + \new48 Added in version 4.8 + + + + Gets or sets the cursor mode for the map. + + The cursor mode determines how the map handles mouse click events on the map. The only mode not handled by the map is cmNone. + + + + Gets or sets zoom behaviour for the map control. + + \new491 Added in version 4.9.1 + Zoomes map to display selected shapes of the specified shapefile. @@ -191,6 +326,11 @@ True on success. \new490 Added in version 4.9.0 + + + Checks to see if the map is currently locked or not. + + Locks the window so that any changes will not be displayed until it is unlocked. @@ -199,6 +339,53 @@ The changes of drawing options in the related classes (Shapefile, Labels, etc.) won't cause the redraw of the map even if it's not locked. The state of the lock mode. + + + Gets or sets a boolean value which indicates whether a wait cursor will be displayed on map redraw. + + + + + Gets or sets the speed of zooming with mouse wheel. + + The default values is 0.5. The values in 0.1 - 10.0 range are accepted. The value 1.0 will turn off + the zooming by mouse wheel. + + + + Gets or sets whether the map sends mouse down events. + + + + + Gets or sets whether the map sends mouse move events. + + + + + Gets or sets whether the map sends mouse up events. + + + + + Gets or sets a boolean value which indicates whether the map sends on draw back buffer events. + + + + + Gets or sets whether the map sends the SelectBoxDrag event. + + + + + Gets or sets whether the map sends the SelectBoxFinal event. + + + + + Gets or sets a boolean value which can affect the displaying of the context menus in client code by the right click. + + Zooms the display in by the given factor. @@ -211,6 +398,11 @@ The factor to zoom out by. + + + Gets or sets the factor by which to zoom the view of the map in or out. + + Zooms the map display to the specified layer. @@ -242,6 +434,87 @@ The handle of the layer containing the shape to zoom to. The index of the shape to zoom to. + + + Gets or sets a value indicating whether zoom bar will be displayed on the map. + + Zoom bar can be displayed only if projection of the map is set. Zoom levels + depend upon tile of the current tile provider. + /see AxMap.TileProvider, AxMap.Projection + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether animation will be displayed zooming map in or out. + + Default csAuto value will display animation only if there are no data layers + within visisble extents. Animation also won't be displayed if there are more than 4 + zoom levels between current and target level. + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether animation will be displayed to simulate + inertia after panning operation. + + Default csAuto value will display animation only if there are no data layers + within visisble extents. + \note Mouse panning is somewhat more tricky than the one with smartphone's touch screen, + so some practice may be needed to learn not to stop mouse motion before releasing the button ))) + + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether currently rendered tile buffer should be scaled + and reused during the next redraw. + + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether the legacy 'hand' cursor should be used + for map panning rather than the standard 'NSEW' four-point cursor. + + \new495 Added in version 4.9.5 + + + + Gets or sets the amount of information to be displayed in zoom bar tool tip. + + \new492 Added in version 4.9.2 + + + + Gets or sets a style of zoom box, which is used to select a region with Zoom In tool. + + \new492 Added in version 4.9.2 + + + + Gets or sets minimum zoom level to be used by zoom bar. + + This property won't increase the number of available levels, + if certain levels aren't supported by the provider they still won't be displayed. + \new492 Added in version 4.9.2 + + + + Gets or sets maximum zoom level to be used by zoom bar. + + This property won't increase the number of available levels, + if certain levels aren't supported by the provider they still won't be displayed. + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether to move the mouse click point to the center of the map + when using the Zoom In or Zoom Out tools. + + The default value is False, indicating that the map is not recentered, + but instead keeps the click point at the mouse position and zooms around that point. + \new495 Added in version 4.9.5 + Reverts the last operation performed by user in interactive shape editor. @@ -251,6 +524,21 @@ \new493 Added in version 4.9.3 + \addtogroup map_serialization Map serialization + Here is a list of properties and methods to preserve the state of the map and particular layers. This module is a part of the documentation of AxMap class. + \dot + digraph map_serialization { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Map Serialization" URL="\ref map_serialization"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Serializes the layer settings to the string. @@ -348,6 +636,21 @@ \new48 Added in version 4.8 + \addtogroup map_layer_properties Layer properties + Here is a list of properties common to all data layers. This module is a part of the documentation of AxMap class. + \dot + digraph map_layer_properties { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Layer Properties" URL="\ref map_layer_properties"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Gets maximum zoom at which the layer will be displayed. @@ -549,6 +852,21 @@ The color scheme for the specified layer + \addtogroup map_layer_management Layer management + Here is a list of properties and methods which allow to work with layers of the map. This module is a part of the documentation of AxMap class. + \dot + digraph map_layer { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Layer Management" URL="\ref map_layer_management"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Removes all data from the map and sets its properties to the default state. @@ -628,6 +946,11 @@ The initial position of the layer to be moved. Boolean value representing success when true, failure when false. + + + Gets the number of layers loaded in the map. + + Removes all layers from the map. @@ -718,6 +1041,21 @@ \new493 Added in version 4.9.3 + \addtogroup map_drawing_layers Drawing layers + Here is a list of methods and properties to interact with the drawing layers of the map. This module is a part of the documentation of AxMap class. + \dot + digraph map_drawing_layers { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Drawing Layers" URL="\ref map_drawing_layers"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Replaces the labels associated with the drawing layer. @@ -947,6 +1285,23 @@ \new493 Added in version 4.9.3 + \addtogroup map_shapefile Shapefile visualization + Here is a list of properties for changing appearance of shapefile layer added to the map. + Consider the usage of ShapeDrawingOptions class to access wider set of options. + See Shapefile.DefaultDrawingOptions for details. This module is a part of the documentation of AxMap class. + \dot + digraph map_shapefile { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Shapefile visualization" URL="\ref map_shapefile"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Gets whether the specified layer is drawn with a fill. Only works on polygon shapefiles. @@ -1124,391 +1479,65 @@ The handle of the shapefile layer. The color of stipple. - - + - Gets a boolean value which indicates whether the background of fill stipple for polygon shapefile layer will be transparent. + Sets the color of the polygon stipple for shapefile layer. This property corresponds to the ShapeDrawingOptions.FillBgTransparent property. + This property corresponds to the ShapeDrawingOptions.FillHatchStyle property. The handle of the shapefile layer. - True in case the background is transparent and false otherwise. + The color of stipple. + \see Shapefile.DefaultDrawingOptions - + - Sets a boolean value which indicates whether the background of fill stipple for polygon shapefile layer will be transparent. + Gets a boolean value which indicates whether the background of fill stipple for polygon shapefile layer will be transparent. This property corresponds to the ShapeDrawingOptions.FillBgTransparent property. The handle of the shapefile layer. - True in case the background is transparent and false otherwise. - - - - Sets geographic extents for the map. - - Longitude of center of the screen (degrees). - Latitude of center of the screen (degrees). - Width of displayed extents in kilometres. - Projection for the must be specified in order for this method to work. - True on success. - \new491 Added in version 4.9.1 - - - - Gets known extents. - - Known extents to retrieve. - Extents object. - \new491 Added in version 4.9.1 - - - - Sets geographic extents in decimal degrees for the map. - - Geographic extents in decimal degrees. - True on success. - For operation to succeed, projection must be set for the map (see AxMap.GeoProjection property) - \new490 Added in version 4.9.0 - - - - Converts pixel coordinates to projected map coordinates - - The x pixel coordinate to be converted into the projected x map coordinate. - The y pixel coordinate to be converted into the projected y map coordinate - The projected x map coordinate is returned through this reference parameter. - The projected y map coordinate is returned through this reference parameter. - - - - Converts projected map coordinates into screen pixel units - - The projected x map coordinate to be converted into the x pixel coordinate. - The projected y map coordinate to be converted into the y pixel coordinate. - The pixel x coordinate is returned through this reference parameter - The pixel y coordinate is returned through this reference parameter. - - - - Converts projected map coordinates to decimal degrees (map projection must be specified for this method to work). - - Projected X map coordinate. - Projected Y map coordinate. - Converted longitude in decimal degrees - Converted latitude in decimal degrees - True on success. - \new491 Added in version 4.9.1 - - - - Converts coordinates in decimal degrees to pixel coordinates (map projection must be specified for this method to work). - - X screen coordinate. - Y screen coordinate. - Converted longitude in decimal degrees - Converted latitude in decimal degrees - True on success. - \new491 Added in version 4.9.1 - - - - Converts coordinates in decimal degrees to projected map coordinates (map projection must be specified for this method to work). - - Longitude in decimal degrees. - Latitude in decimal degrees. - Resulting projected X map coordinate. - Resulting Projected Y map coordinate. - True on success. - \new491 Added in version 4.9.1 - - - - Converts pixel coordinates to decimal degrees (map projection must be specified for this method to work). - - Longitude in decimal degrees. - Latitude in decimal degrees. - Converted X screen coordinate. - Converted Y screen coordinate. - True on success. - \new491 Added in version 4.9.1 - - - - Calculates area of polygon taking into account the shape of Earth. - - For the time being only single-part polygons are accepted as input. Calculation are made using - GeographicLib. - Single part polygon shape defined in coordinates of map. - Area of shape in square meters or 0.0 if current map projection doesn't support transformation to WGS84. - \new493 Added in version 4.9.3 - - - - Calculates geodesic distance between 2 points defined in map coordinate system. - - To calculate geodesic distance between 2 points in screen coordinates use AxMap.PixelToProj first. - Calculation are made using GeographicLib. - X coordinate of the first point. - Y coordinate of the first point. - X coordinate of the second point. - Y coordinate of the second point. - Distance between 2 points in meters 0.0 if current map projection doesn't support transformation to WGS84 - \new493 Added in version 4.9.3 - - - - Calculates length of polyline or perimeter of polygon taking into account the shape of Earth. - - For the time being only single-part shapes are accepted as input. Calculation are made using - GeographicLib. - Single part polygon or polyline shape defined in coordinates of map. - Length of polyline or perimeter of polygon in meters or 0.0 if current map projection doesn't support transformation to WGS84. - \new493 Added in version 4.9.3 - - - - Gets or sets the user defined cursor handle. The handle is a windows cursor handle. - - - - - Gets or sets the object of Tiles class associated with map. - - \new490 Added in version 4.9.0 - - - - Gets FileManager object associated with map. The object is used by AxMap.AddLayerFromFilename methods. - - \new491 Added in version 4.9.1 - - - - Gets or sets the background color of the map. - - When using VB.NET the color is represented as a System.Drawing.Color. - When using VB 6 the color can be an OLE_COLOR or an integer representation of an RGB value. - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - .NET clients passing ICallback implementation to this property must make respective - class COM visible by setting ComVisible(true) attribute. In fact ComVisible(true) is set by default - for public classes, so it's enough to make sure that it isn't explicitly set to false for the class - or assembly where the class is defined. Otherwise InvalidCastException may occur at runtime. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - The key may be used by the programmer to store any string data associated with the object. - - - - - Retrieves the last error generated in the object. - - - - - Gets or sets the cursor used with the map. When using crsrUserDefined be sure to set a UDCursorHandle. - - - - - Gets or sets the value which indicates how the control adjust its content after the resizing operations. - - - - - Gets or sets a value which indicates whether the time of map redraw will be displayed on the screen. - - Only times of full redraws when data layers are drawn anew are displayed. - \new48 Added in version 4.8 - - - - Gets or sets a boolean value which indicate whether control's version number will be displayed on the screen. - - \new48 Added in version 4.8 - - - - Gets or sets version number of the control. - - The set part of the property isn't supported. - - - - Gets or sets tile provider for the map. - - This property is a shortcut for AxMap.Tiles.Provider property. - Setting it to ProviderNone will change AxMap.Tiles.Visible property to false. - \new491 Added in version 4.9.1 - - - - Gets list actions performed by user via interactive shape editor. Provides undo/redo capability. - - \new493 Added in version 4.9.3 - - - - Gets an %Identifier object which holds settings of cmIdentify tools. - - \new493 Added in version 4.9.3 - - - - Gets instance of shape editor class associated with map which stores data entered by interactive editing tools. - - \new493 Added in version 4.9.3 - - - - Gets or sets a boolean value which indicate whether map will be redrawn in the course of panning operation. - - The default value is false. Setting this value to true can improve the user experience but - decrease the performance in case large layers are displayed. - \new48 Added in version 4.8 - - - - Gets or sets the cursor mode for the map. - - The cursor mode determines how the map handles mouse click events on the map. The only mode not handled by the map is cmNone. - - - - Gets or sets zoom behaviour for the map control. - - \new491 Added in version 4.9.1 - - - - Checks to see if the map is currently locked or not. - - - - - Gets or sets a boolean value which indicates whether a wait cursor will be displayed on map redraw. - - - - - Gets or sets the speed of zooming with mouse wheel. - - The default values is 0.5. The values in 0.1 - 10.0 range are accepted. The value 1.0 will turn off - the zooming by mouse wheel. - - - - Gets or sets whether the map sends mouse down events. - - - - - Gets or sets whether the map sends mouse move events. - - - - - Gets or sets whether the map sends mouse up events. - - - - - Gets or sets a boolean value which indicates whether the map sends on draw back buffer events. - - - - - Gets or sets whether the map sends the SelectBoxDrag event. - - - - - Gets or sets whether the map sends the SelectBoxFinal event. - - - - - Gets or sets a boolean value which can affect the displaying of the context menus in client code by the right click. - - - - - Gets or sets the factor by which to zoom the view of the map in or out. - - - - - Gets or sets a value indicating whether zoom bar will be displayed on the map. - - Zoom bar can be displayed only if projection of the map is set. Zoom levels - depend upon tile of the current tile provider. - /see AxMap.TileProvider, AxMap.Projection - \new492 Added in version 4.9.2 - - - - Gets or sets a value indicating whether animation will be displayed zooming map in or out. - - Default csAuto value will display animation only if there are no data layers - within visisble extents. Animation also won't be displayed if there are more than 4 - zoom levels between current and target level. - \new492 Added in version 4.9.2 - - - - Gets or sets a value indicating whether animation will be displayed to simulate - inertia after panning operation. - - Default csAuto value will display animation only if there are no data layers - within visisble extents. - \note Mouse panning is somewhat more tricky than the one with smartphone's touch screen, - so some practice may be needed to learn not to stop mouse motion before releasing the button ))) - - \new492 Added in version 4.9.2 - - - - Gets or sets a value indicating whether currently rendered tile buffer should be scaled - and reused during the next redraw. - - \new492 Added in version 4.9.2 - - - - Gets or sets the amount of information to be displayed in zoom bar tool tip. - - \new492 Added in version 4.9.2 - - - - Gets or sets a style of zoom box, which is used to select a region with Zoom In tool. - - \new492 Added in version 4.9.2 + True in case the background is transparent and false otherwise. - + - Gets or sets minimum zoom level to be used by zoom bar. + Sets a boolean value which indicates whether the background of fill stipple for polygon shapefile layer will be transparent. - This property won't increase the number of available levels, - if certain levels aren't supported by the provider they still won't be displayed. - \new492 Added in version 4.9.2 + This property corresponds to the ShapeDrawingOptions.FillBgTransparent property. + The handle of the shapefile layer. + True in case the background is transparent and false otherwise. - + + \addtogroup map_extents Max extents and zoom + Here is list of properties and methods that affect map extents and zoom level. This module is a part of the documentation of AxMap class. + \dot + digraph map_extents { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Map extents adn zoom" URL="\ref map_extents"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ - Gets or sets maximum zoom level to be used by zoom bar. + Sets geographic extents for the map. - This property won't increase the number of available levels, - if certain levels aren't supported by the provider they still won't be displayed. - \new492 Added in version 4.9.2 + Longitude of center of the screen (degrees). + Latitude of center of the screen (degrees). + Width of displayed extents in kilometres. + Projection for the must be specified in order for this method to work. + True on success. + \new491 Added in version 4.9.1 - + - Gets the number of layers loaded in the map. + Gets known extents. + Known extents to retrieve. + Extents object. + \new491 Added in version 4.9.1 @@ -1518,6 +1547,15 @@ Otherwise null will be returned. \new490 Added in version 4.9.0 + + + Sets geographic extents in decimal degrees for the map. + + Geographic extents in decimal degrees. + True on success. + For operation to succeed, projection must be set for the map (see AxMap.GeoProjection property) + \new490 Added in version 4.9.0 + Gets or sets latitude of the center of screen (in decimal degrees). @@ -1573,6 +1611,7 @@ Gets or sets the extents of the map using an Extents object. If the given extents do not fit the aspect ratio of the map, the map will fit the given extents as well as possible. + \new495 Return value changed to IExtents in version 4.9.5 @@ -1580,6 +1619,145 @@ + \addtogroup map_coordinates Map projection and coordinates + Here is list of properties and methods which are related to coordinate system, projection of map and units conversion. + This module is a part of the documentation of AxMap class. + \dot + digraph map_projection { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Max projection and coordianates" URL="\ref map_coordinates"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description\n\n + \anchor a_projection + \section proj1 A. Setting projection for the map. + + No matter what type of GIS application you are going to write, the decision about map coordinate system and projection is one of the first to be made. + MapWinGIS provides the following options. + + \dot + digraph projection_options { + splines = true; + ranksep = 0.15; + nodesep = 0.5; + node [shape = oval, peripheries = 1, fontname=Helvetica, fontsize=9, fillcolor = gray, color = "gray", style = filled, height = 0.3, width = 0.8]; + render [ label="Choosing map projection"]; + + node [shape = "note", width = 0.3, height = 0.3, peripheries = 1 fillcolor = "khaki" ] + s1 [label=" Set projection manullay\l"]; + s2 [label=" Grab projection from data\l"]; + s3 [label=" Don't use projection at all\l"]; + + edge [dir = none, arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#808080" minlen=2 ] + render -> s1; + render -> s2; + render -> s3; + } + \enddot + Let's consider each of the approaches. + + 1. Settings projection manually. \n\n + It can be done using one of the following approaches:\n\n + a) AxMap.Projection property - provides only most common projections (Spherical Mercator, WGS84) but available in Properties Window of Form designer. + \code + axMap1.Projection = tkMapProjection.PROJECTION_WGS84; + \endcode + b) For all other projections - GeoProjection class and AxMap.GeoProjection property: + \code + var gp = new GeoProjection(); + + // one of the following methods can be used; see more in GeoProjection class + // - use projections provided by MapWinGIS enumerations: + gp.SetWgs84Projection(tkWgs84Projection.Wgs84_UTM_zone_22N); + gp.SetWellKnownGeogCS(tkCoordinateSystem.csNAD83); + + // - EPSG code of coordinate system; in this example Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 5; see wwww.spatialreference.org for EPSG codes + gp.ImportFromEPSG(2399); + + // - importing from proj4 or WKT string; in this example proj4 string for Amersfoort / RD New projection for Netherlands + gp.ImportFromAutoDetect("+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs "); + + // applying projection + axMap1.GeoProjection = gp; + \endcode + + 2. Grabbing coordinate system and projection from data. + \code + axMap1.GrabProjectionFromData = true; // default value + axMap1.AddLayerFromFilename(@"d:\some_shapefile.shp", tkFileOpenStrategy.fosVectorLayer, true); + \endcode + GeoProjection will be taken from the first layer added to the map which has metadata about projection. AxMap.GeoProjection property will be updated from this metadata. + When last layer is removed from map AxMap.GeoProjection property will be cleared (set to empty projection). + + 3. Don't specify coordinate system at all.\n + - AxMap.Projection property is equal to PROJECTION_NONE (the default value); + - map units should be set manually via AxMap.MapUnits; + - calculation of distance and area will use Euclidean geometry with no account to the shape of Earth; + - it won't be possible to display tiles from TMS servers. + + To setup map to work without geoprojection use the code: + \code + axMap1.Projection = tkMapProjection.PROJECTION_NONE; + axMap1.GrabProjectionFromData = false; + axMap1.MapUnits = tkUnitsOfMeasure.umMeters; // or another, depending on the data you display + \endcode + + \section proj2 B. Interaction with already set projection + + To check that map actually has a projection: + \code + Debug.WriteLine("Map has projection:" + (axMap1.Projection != tkMapProjection.PROJECTION_NONE)); + // or with mode details + Debug.WriteLine("Projection of the map: " + (axMap1.GeoProjection.IsEmpty() ? "None" : axMap1.GeoProjection.ExportToWKT()); + \endcode + + Another way to check whether map has geoprojection is to see how coordinates are displayed when AxMap.ShowCoordinates is set to cdmAuto. + In case decimal degrees are displayed (Lat/Lng) - map has geoprojection, if x/y pair is shown - no geoprojection was set. + + All of these methods will result in updating AxMap.GeoProjection property. GeoProjection object assigned to map is protected from changes, + i.e. GeoProjection.IsFrozen = true. To change already assigned projection, a new instance of GeoProjection object must be created: + \code + // this one will fail, because projection is frozen + if (!axMap1.GeoProjection.ImportFromEPSG(2399)) + { + Debug.WriteLine("Projection wasn't set: " + axMap1.GeoProjection.get_ErrorMsg(axMap1.GeoProjection.LastErrorCode)); + } + // this one will succeed as a new GeoProjection instance is created by Clone method: + var gp = axMap1.GeoProjection.Clone(); + if (gp.ImportFromEPSG(2399)) + { + axMap1.GeoProjection = gp; + } + \endcode + + Regardless of the method for settings projection MapWinGIS will update AxMap.MapUnits. IF coordinate system is geographic one umDecimalDegrees + will be set, otherwise umMeters. This will ensure that scalebar and measuring will work correctly. + + \section proj3 C. Choosing projection + + When making decision about coordinate system and projection consider:\n\n + 1. Whether it's important to display tiles from online services. Most TMS servers use Shperical Mercator projection (EPSG:3857), + therefore to avoid distortions of tiles map projection should be set to GoogleMercator as well: + \code + axMap1.Projection = tkMapProjection.PROJECTION_GOOGLE_MERCATOR; + \endcode + \note See more details on the issue in description of Tiles class.\n\n + + 2. What data you plan to display and what projection it's using. It's possible to do a reprojection with: + - Utils.ReprojectShapefile for shapefiles; + - Utils.GDALWarp for images and grids. + + But it should be considered whether it is worth the effort. + + Starting from version 4.9.2. built-in projection mismatch testing is implemented + optional + transformation for shapefiles. See GlobalSettings.AllowProjectionMismatch, GlobalSettings.ReprojectLayersOnAdding. + + @{ Gets measuring object associated with map. @@ -1593,6 +1771,15 @@ This method affects the calculation of map scale (see AxMap.CurrentScale). \new48 Added in version 4.8 + + + Converts pixel coordinates to projected map coordinates + + The x pixel coordinate to be converted into the projected x map coordinate. + The y pixel coordinate to be converted into the projected y map coordinate + The projected x map coordinate is returned through this reference parameter. + The projected y map coordinate is returned through this reference parameter. + Gets the number of screen pixels per the decimal degree of the data. @@ -1600,6 +1787,15 @@ The set part of this property isn't supported. The correctness of results depends on AxMap.MapUnits property. \new48 Added in version 4.8 + + + Converts projected map coordinates into screen pixel units + + The projected x map coordinate to be converted into the x pixel coordinate. + The projected y map coordinate to be converted into the y pixel coordinate. + The pixel x coordinate is returned through this reference parameter + The pixel y coordinate is returned through this reference parameter. + Gets or sets a value indicating whether coordinates of the current mouse position will be displayed on map. @@ -1643,7 +1839,98 @@ This property must be set in order for certain functionality to work (tiles, for example). \new490 Added in version 4.9.0 + + + Converts projected map coordinates to decimal degrees (map projection must be specified for this method to work). + + Projected X map coordinate. + Projected Y map coordinate. + Converted longitude in decimal degrees + Converted latitude in decimal degrees + True on success. + \new491 Added in version 4.9.1 + + + + Converts coordinates in decimal degrees to pixel coordinates (map projection must be specified for this method to work). + + X screen coordinate. + Y screen coordinate. + Converted longitude in decimal degrees + Converted latitude in decimal degrees + True on success. + \new491 Added in version 4.9.1 + + + + Converts coordinates in decimal degrees to projected map coordinates (map projection must be specified for this method to work). + + Longitude in decimal degrees. + Latitude in decimal degrees. + Resulting projected X map coordinate. + Resulting Projected Y map coordinate. + True on success. + \new491 Added in version 4.9.1 + + + + Converts pixel coordinates to decimal degrees (map projection must be specified for this method to work). + + Longitude in decimal degrees. + Latitude in decimal degrees. + Converted X screen coordinate. + Converted Y screen coordinate. + True on success. + \new491 Added in version 4.9.1 + + + + Calculates area of polygon taking into account the shape of Earth. + + For the time being only single-part polygons are accepted as input. Calculation are made using + GeographicLib. + Single part polygon shape defined in coordinates of map. + Area of shape in square meters or 0.0 if current map projection doesn't support transformation to WGS84. + \new493 Added in version 4.9.3 + + + + Calculates geodesic distance between 2 points defined in map coordinate system. + + To calculate geodesic distance between 2 points in screen coordinates use AxMap.PixelToProj first. + Calculation are made using GeographicLib. + X coordinate of the first point. + Y coordinate of the first point. + X coordinate of the second point. + Y coordinate of the second point. + Distance between 2 points in meters 0.0 if current map projection doesn't support transformation to WGS84 + \new493 Added in version 4.9.3 + + + + Calculates length of polyline or perimeter of polygon taking into account the shape of Earth. + + For the time being only single-part shapes are accepted as input. Calculation are made using + GeographicLib. + Single part polygon or polyline shape defined in coordinates of map. + Length of polyline or perimeter of polygon in meters or 0.0 if current map projection doesn't support transformation to WGS84. + \new493 Added in version 4.9.3 + + \addtogroup map_events Map events + \dot + digraph map_events_graph { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="AxMap" URL="\ref AxMap"]; + node [shape = "ellipse", color = gray, width = 0.2, height = 0.2, style = filled] + gr [label="Map events" URL="\ref map_events"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ This event is fired after the rendering of drawing layers. Handle of device context is passed to allow the user to implement custom drawing. @@ -1655,6 +1942,19 @@ Passed by reference. The value should be set to blnTrue in case some additional drawing is performed in client code. + + + This event is fired after the rendering of standard layers. Handle of device context is passed to allow the user to implement custom drawing. + + Handle of device context of screen buffer. + Minimum X coordinate of the rectangle being rendered. + Maximum X coordinate of the rectangle being rendered. + Minimum Y coordinate of the rectangle being rendered. + Maximum Y coordinate of the rectangle being rendered. + Passed by reference. + The value should be set to blnTrue in case some additional drawing is performed in client code. + \new495 Added in version 4.9.5 + This event is fired after interactive editing of shape is finished (AxMap.CursorMode is set to cmEditShape). @@ -1714,6 +2014,19 @@ Passed by reference. The value should be set to blnTrue in case some additional drawing is performed in client code. + + + This event is fired before the rendering of standard layers. Handle of device context is passed to allow the user to implement custom drawing. + + Handle of device context of screen buffer. + Minimum X coordinate of the rectangle being rendered. + Maximum X coordinate of the rectangle being rendered. + Minimum Y coordinate of the rectangle being rendered. + Maximum Y coordinate of the rectangle being rendered. + Passed by reference. + The value should be set to blnTrue in case some additional drawing is performed in client code. + \new495 Added in version 4.9.5 + This event is fired before editing starts for particular shape (after user click on the shape when map cursor is set to cmEditShape). @@ -1947,6 +2260,13 @@ New API members to substitute deprecated ones are listed in description. + + + Gets or sets line separation factor. + + \deprecated v4.8. Use LinePattern class, and ShapeDrawingOptions.LinePattern property instead. + \removed493 Removed in v4.9.3 + Gets one user defined stipple row. @@ -2485,6 +2805,15 @@ \deprecated v4.9.3 Use Utils.IsTiffGrid instead. \removed493 Removed in v4.9.3. + + + Gets or sets the drawing method for vector layers. + + The default value is vdmNewSymbology. From the version 4.8 this is the only value supported. + \new48 Added in version 4.8 + \deprecated v4.8 No longer used. + \removed493 Removed in v4.9.3 + Sets a coloring scheme to be associated with an image layer. @@ -2730,6 +3059,14 @@ \deprecated v4.9.3 Use AxMap.get_LayerLabels, Labels.FontName, Labels.FontSize, Labels.FontBold, Labels.FontItalic, Labels.FontUnderline instead. \removed493 Removed in v4.9.3 + + + Gets or sets a boolean value which indicates whether multiline labels will be drawn correctly on the map. + + \deprecated v 4.8. Multiline labels will be drawn after specification of appropriate label expression. + \see Labels.Expression. + \removed493 Removed in v4.9.3 + Adds label to the specified drawing layer. @@ -2876,6 +3213,13 @@ \deprecated v 4.9.3 Use AxMap.get_DrawingLabels, Labels.FontName, Labels.FontSize instead. \removed493 Removed in v4.9.3 + + + Gets or sets the angle of map rotation in degrees. + + \deprecated v.4.9.3 The functionality is no longer supported. + \removed493 Removed in v4.9.3 + Sets the numeric value which determines the transparency of the given image layer. @@ -2935,46 +3279,6 @@ \deprecated v4.9.3 Use GeoProjection.get_IsSame, GeoProjection.get_IsSameExt instead. \removed493 Removed in v4.9.3 - - - Deprecated. Updates the extents of the layer before the drawing. - - The handle of the layer. - True on success and false in case of invalid layer handle. - \deprecated v.4.8. The call is incorporated into drawing routine. - \removed493 Removed in v4.9.3 - - - - Gets or sets line separation factor. - - \deprecated v4.8. Use LinePattern class, and ShapeDrawingOptions.LinePattern property instead. - \removed493 Removed in v4.9.3 - - - - Gets or sets the drawing method for vector layers. - - The default value is vdmNewSymbology. From the version 4.8 this is the only value supported. - \new48 Added in version 4.8 - \deprecated v4.8 No longer used. - \removed493 Removed in v4.9.3 - - - - Gets or sets a boolean value which indicates whether multiline labels will be drawn correctly on the map. - - \deprecated v 4.8. Multiline labels will be drawn after specification of appropriate label expression. - \see Labels.Expression. - \removed493 Removed in v4.9.3 - - - - Gets or sets the angle of map rotation in degrees. - - \deprecated v.4.9.3 The functionality is no longer supported. - \removed493 Removed in v4.9.3 - Gets or sets a boolean value which indicates how images with identical size and position on the map will be drawn. @@ -3009,5 +3313,24 @@ \deprecated v4.8 This property is no longer used. \removed493 Removed in v4.9.3 + + + Deprecated. Updates the extents of the layer before the drawing. + + The handle of the layer. + True on success and false in case of invalid layer handle. + \deprecated v.4.8. The call is incorporated into drawing routine. + \removed493 Removed in v4.9.3 + + + + Justification of the labels + + + + + Shape drawing method + + diff --git a/src/InnoSetup/Interop.MapWinGIS.XML b/src/InnoSetup/Interop.MapWinGIS.XML index 6d16d5b8..894eb1e3 100644 --- a/src/InnoSetup/Interop.MapWinGIS.XML +++ b/src/InnoSetup/Interop.MapWinGIS.XML @@ -210,129 +210,6 @@ The index of the field in the attribute table to take values from. The colour of the sector or bar for visualization of a field. - - - Clears the information about individual charts like position and visibility. - - To restore the charts a call of Charts.Generate() is needed. The fields - will remain untouched by this method. - - - - Removes all fields which define bars or sectors of the chart. - - - - - Restores the state of the charts from the serialized string. - - Serialized string generated by Charts.Serialize(). - - - - Draws a chart on the specified device context. Can be used for displaying of map legend. - - The handle of the device context. - The position of the left corner of the drawing in pixels. - The position of the top corner of the drawing in pixels. - When set to true the labels won't be drawn. - The back colour of the device context. - Should be provided to ensure correct alpha blending when transparency is set. - True on success and false otherwise. - - - - Generates a chart for every shape of the parent shapefile. - - This method is time consuming for large shapefiles, therefore consider the serialization of - charts data after first generation. - The position of chart relative to the parent shape. - True on success and false otherwise. - - - - Inserts a field which represents single bar or sector of the chart. - - The index to insert the field at. - The chart field object to insert. - True on success and false otherwise. - - - - Inserts a field which represents single bar or sector of the chart. - - The index to insert the field at. - The index of the field from the attribute table (.dbf) to take values from. - The colour of the fill. - True on success and false otherwise. - - - - Loads charts data from the XML file generated by Charts.SaveToXML. - - The filename to load data from. - True on successful loading and false otherwise. - - - - Changes the position of a field (bar or sector) in the list which affects the order of drawing. - - The old index of the field. - The new index of the field. - - - - - Removes the field which corresponds to the bar or the sector of the chart. - - The index of the field to remove. - True on success and false otherwise. - - - - Saves the state of the charts to the XML file. - - Charts.SavingMode defines the particular data which will be serialized. - The filename to save into. - True on success and false otherwise. - - - - Returns the indices of charts which are displayed within specified rectangle on the screen. - - The rectangle to select charts within (in screen coordinates). - The tolerance in pixels. The bounding box will be expanded by this values. - The selection mode. - The array of integer type with indices of the selected charts. - True if at least one chart was selected and false otherwise. - - - - Serializes the state of the charts to the string. - - The serialized string. - - - - Gets a reference to the chart with the specified index. - - The index of the chart to extract. - The reference to the chart of NULL reference on failure. - - - - Gets the description of the specified error code. - - The error code returned by Charts.LastErrorCode. - The description of error. - - - - Gets a reference to the field of the chart with the specified index. - - The index of the field. - The reference to the chart field or NULL reference on failure. - Gets or set a boolean value which indicates whether charts can overlap each other. @@ -366,6 +243,18 @@ Bar and pie charts are available. All charts of the shapefile are of the same type. + + + Clears the information about individual charts like position and visibility. + + To restore the charts a call of Charts.Generate() is needed. The fields + will remain untouched by this method. + + + + Removes all fields which define bars or sectors of the chart. + + Gets or sets the minimal distance between individual charts when Charts.AvoidCollisions is set to true. @@ -379,12 +268,39 @@ Returns the number of charts which is equal to the number of shapes in the parent shapefile. + + + Restores the state of the charts from the serialized string. + + Serialized string generated by Charts.Serialize(). + + + + Draws a chart on the specified device context. Can be used for displaying of map legend. + + The handle of the device context. + The position of the left corner of the drawing in pixels. + The position of the top corner of the drawing in pixels. + When set to true the labels won't be drawn. + The back colour of the device context. + Should be provided to ensure correct alpha blending when transparency is set. + True on success and false otherwise. + Gets or sets a value which indicates whether charts will be visible for all scales or in the given range of scales only. \see Charts.MaxVisibleScale, Charts.MinVisibleScale + + + Generates a chart for every shape of the parent shapefile. + + This method is time consuming for large shapefiles, therefore consider the serialization of + charts data after first generation. + The position of chart relative to the parent shape. + True on success and false otherwise. + Gets or sets a callback object to display progress and error information. @@ -403,6 +319,23 @@ The property can be used for interactive selection of charts and for drawing of legend. + + + Inserts a field which represents single bar or sector of the chart. + + The index to insert the field at. + The chart field object to insert. + True on success and false otherwise. + + + + Inserts a field which represents single bar or sector of the chart. + + The index to insert the field at. + The index of the field from the attribute table (.dbf) to take values from. + The colour of the fill. + True on success and false otherwise. + Gets or sets a string value associated with the object. @@ -419,6 +352,13 @@ Gets or sets the color of the chart outline + + + Loads charts data from the XML file generated by Charts.SaveToXML. + + The filename to load data from. + True on successful loading and false otherwise. + Get or sets the maximum scale the charts are displayed when dynamic visibility is turned on. @@ -429,6 +369,14 @@ Gets or sets the minimal scale the charts are displayed when dynamic visibility is turned on. + + + Changes the position of a field (bar or sector) in the list which affects the order of drawing. + + The old index of the field. + The new index of the field. + + Gets or sets the index of field upon which the values of other fields will be divided before displaying charts. @@ -472,11 +420,42 @@ This property is no implemented. + + + Removes the field which corresponds to the bar or the sector of the chart. + + The index of the field to remove. + True on success and false otherwise. + + + + Saves the state of the charts to the XML file. + + Charts.SavingMode defines the particular data which will be serialized. + The filename to save into. + True on success and false otherwise. + Gets or sets the mode for serialization of charts. Affects Charts.SaveToXML method. + + + Returns the indices of charts which are displayed within specified rectangle on the screen. + + The rectangle to select charts within (in screen coordinates). + The tolerance in pixels. The bounding box will be expanded by this values. + The selection mode. + The array of integer type with indices of the selected charts. + True if at least one chart was selected and false otherwise. + + + + Serializes the state of the charts to the string. + + The serialized string. + Gets or sets the index of field which affect the radius of charts when Charts.UseVariableRadius is set to true. @@ -573,6 +552,27 @@ Turns on or off the visibility of charts. + + + Gets a reference to the chart with the specified index. + + The index of the chart to extract. + The reference to the chart of NULL reference on failure. + + + + Gets the description of the specified error code. + + The error code returned by Charts.LastErrorCode. + The description of error. + + + + Gets a reference to the field of the chart with the specified index. + + The index of the field. + The reference to the chart field or NULL reference on failure. + @@ -592,16 +592,37 @@ \new494 Added in version 4.9.4 - + - Removes colour break with specified index. + Gets or set the callback object to report errors. - The index of colour break to remove. - True on successful removal and false otherwise. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Clears all the existing breaks and creates 2 breaks with the specified colours. + Gets or sets the string value associated with the instance of the class. + + + + + Gets the code of the last error which occurred within this instance of class. + + + + + Returns the number of breaks within colour scheme. + + + + + Removes colour break with specified index. + + The index of colour break to remove. + True on successful removal and false otherwise. + + + + Clears all the existing breaks and creates 2 breaks with the specified colours. The values of the breaks will be 0.0 for the first one and 1.0 for the second. The colour of the first break. @@ -681,27 +702,6 @@ The index of the break. The new colour to set. - - - Gets or set the callback object to report errors. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Gets or sets the string value associated with the instance of the class. - - - - - Gets the code of the last error which occurred within this instance of class. - - - - - Returns the number of breaks within colour scheme. - - Represents a layer downloading and displaying the data from the particular WMS Server. @@ -726,6 +726,11 @@ String with the previous state of the layer. True on success. + + + Gets the code of the last error which occurred inside this instance. + + Gets error message for the specific error code. @@ -733,11 +738,6 @@ The error code. The error message. - - - Gets the code of the last error which occurred inside this instance. - - Gets or sets a key associated with this instance (any data can be stored in it by applications). @@ -897,6 +897,11 @@ The column. The row. + + + Gets the count. + + Gets the layer handle for the item with specified pixel. @@ -949,11 +954,6 @@ Column index or -1 if the specified item is a shape. \new495 Added in version 4.9.5 - - - Gets the count. - - Represents a single band of raster datasource. @@ -1033,29 +1033,6 @@ The count. True on success. - - - Gets the specified metadata item. - - Index of the item. - String with metadata. - - - - Gets specified overview of the raster band. - - Index of the overview. - The overview as another instance of GdalRasterBand. - - - - Gets the value of the specified pixel. - - The column. - The row. - The value. - True on success. - Gets no data value. @@ -1131,17 +1108,45 @@ Gets the number of metadata items associated with the band. + + + Gets the specified metadata item. + + Index of the item. + String with metadata. + Gets the color table associated with the band. + + + Gets specified overview of the raster band. + + Index of the overview. + The overview as another instance of GdalRasterBand. + + + + Gets the value of the specified pixel. + + The column. + The row. + The value. + True on success. + Holds all available GDAL drivers. \new494 Added in version 4.9.4 + + + Gets the number of drivers. + + Gets the specified driver. @@ -1156,11 +1161,6 @@ Name of the driver. The driver. - - - Gets the number of drivers. - - Represents a single GDAL driver. @@ -1175,6 +1175,11 @@ The metadata. String with metadata. + + + Gets the the number of metadata items associated with the driver. + + Gets specified metadata item. @@ -1182,6 +1187,21 @@ Index of the metadata item. String with metadata. + + + Gets the name of the driver. + + + + + Gets a value indicating whether the driver works vector data. + + + + + Gets a value indicating whether the driver works raster data. + + Gets the type of the specified metadata item. @@ -1203,26 +1223,6 @@ Index of the metadata item. Metadata item key. - - - Gets the the number of metadata items associated with the driver. - - - - - Gets the name of the driver. - - - - - Gets a value indicating whether the driver works vector data. - - - - - Gets a value indicating whether the driver works raster data. - - Represents a light wrapper around GDAL raster dataset which allows to perform some @@ -1274,30 +1274,16 @@ \new494 Added in version 4.9.4 - - - Gets the alias of the function. - - Index of the alias. - - - - Gets the name of the specified parameter. - - Index of the parameter. - The name of the parameter. - - + - Gets the description of the specified parameter of the function. + Gets the name of the function. - Index of the parameter. - The description of the parameter. - + - Gets the name of the function. + Gets the alias of the function. + Index of the alias. @@ -1319,6 +1305,20 @@ Gets the description of the function. + + + Gets the name of the specified parameter. + + Index of the parameter. + The name of the parameter. + + + + Gets the description of the specified parameter of the function. + + Index of the parameter. + The description of the parameter. + Gets the signature of the function. @@ -1368,13 +1368,6 @@ The result of calculation (string, double, or boolean). True on success. - - - Gets the specified function from the list of function recognized by the expression parser. - - Index of the function. - The function object with metadata. - Gets the last error message. @@ -1390,6 +1383,13 @@ Gets the number of functions recognized by the expression parser. + + + Gets the specified function from the list of function recognized by the expression parser. + + Index of the function. + The function object with metadata. + Gets the table associated with the current expression. @@ -1469,6 +1469,12 @@ The filename of the ESRI grid to be deleted. A boolean value representing the success or failure of deleting the specified ESRI grid. + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + Gets whether or not the specified file is an ESRI grid. @@ -1476,6 +1482,11 @@ The filename of the grid to be checked. A boolean value representing whether or not the specified file is an ESRI grid. + + + Retrieves the last error generated in the object. + + Retrieves the error message associated with the specified error code. @@ -1483,17 +1494,6 @@ The error code for which the error message is required. The error message description for the specified error code. - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Retrieves the last error generated in the object. - - Represents a rectangle on the map. @@ -1566,50 +1566,19 @@ The new minimum measure bound for the extents object. The new maximum measure bound for the extents object. - + - Gets serialized contents of the extents for debug purposes. + The maximum measure bound in the exents object. Measure bounds only apply to shapefiles containing measure data. - Serialized string. - \new491 Added in version 4.9.1 - + - Moves extents so that center point will be at specified coordinates, while width and height will be preserved. + Gets the minimum measure bound for the extents object. Measure bounds only apply to shapefiles containing measure data. - X coordinate of new center. - Y coordinate of new center. - \new491 Added in version 4.9.1 - + - Checks whether a point is within extents - - X coordinate of point - Y coordinate of point - True if point is within extents - \new491 Added in version 4.9.1 - - - - Creates a rectangular polygon matching current extents. - - New polygon shape. - \new491 Added in version 4.9.1 - - - - The maximum measure bound in the exents object. Measure bounds only apply to shapefiles containing measure data. - - - - - Gets the minimum measure bound for the extents object. Measure bounds only apply to shapefiles containing measure data. - - - - - The maximum x bound for the extents object. + The maximum x bound for the extents object. @@ -1637,12 +1606,58 @@ Gets the minimum z bound for the extents object. + + + Gets serialized contents of the extents for debug purposes. + + Serialized string. + \new491 Added in version 4.9.1 + Gets a center point for the extents. \new491 Added in version 4.9.1 + + + Moves extents so that center point will be at specified coordinates, while width and height will be preserved. + + X coordinate of new center. + Y coordinate of new center. + \new491 Added in version 4.9.1 + + + + Checks whether a point is within extents + + X coordinate of point + Y coordinate of point + True if point is within extents + \new491 Added in version 4.9.1 + + + + Creates a rectangular polygon matching current extents. + + New polygon shape. + \new491 Added in version 4.9.1 + + + + Gets the Width of the extents object (xMax - xMin). + + + + + Gets the Height of the extents object (yMax - yMin). + + + + + Gets the Depth of the extents object (zMax - zMin). + + Provides settings for built-in identifier tool (cmIdentify cursor). @@ -1701,6 +1716,23 @@ String generated with OgrLayer.Serialize method. True on success. + + + Gets GeoProjection associated with current layer. + + + Corresponds to SRID set for the layer in underlying datasource. + When SRID isn't specified (i.e. equals 0), empty GeoProjection instance will be returned. + + + + Gets the name of geometry column which was used to fetch geometry for current layer. + + Depending on data format, a layer may support several geometry columns but + only one will be used to provide shape data via OgrLayer.GetBuffer(). By default + the first column with geometry/geography type will be used. To access other columns + temporary layers can be opened via OgrDatasource.RunQuery. + Gets layer data represented as in-memory shapefile. @@ -1722,6 +1754,29 @@ The error code returned by LastErrorCode property. String with the description. + + + Gets code of the last error which took place inside this object. + + + + + Gets or sets a Callback object which handles progress and error messages. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + A text string associated with object. Any value can be stored by developer in this property. + + + + + Gets name of the layer. + + The name may correspond to table name in underlying database or store some generic string like + "sql_statement" for temporary layers opened by OgrDatasource.RunQuery. + Opens layer with specified name from the OGR datasource. @@ -1780,6 +1835,34 @@ String with state information. + + + Gets shape type of the current layer. + + The property automatically maps underlying OGRwkbGeometryType to corresponding shape type. + + + + Gets "flattened" type of the current layer, i.e. Z and M components will be ignored. + + + + + Gets name of the driver which is used to access layer datasource. + + + + + Gets the array of available shape types inside OGR layer (should be cast to ShpfileType[]). + + \new494 Added in version 4.9.4 + + + + Gets or sets the type of the active shape type for the layer (is used in OgrLayer.GetBuffer for example). + + \new494 Added in version 4.9.4 + Gets layer name or SQL query which was used to open this layer. @@ -1836,12 +1919,42 @@ if information can't be retrieved from underlying datasource otherwise. Number of features in the layer. + + + Gets source type of the layer. + + Any new instance of class starts with ogrUninitialized. Successful call of OgrLayer.OpenFromDatabase + method will set it to ogrDbTable, OgrLayer.OpenFromQuery - to ogrQuery. + Source type. + + + + Extracts the last error message reported by GDAL library. + + Clears all the styles stored for current layer in datasource. True on success. + + + Gets or sets a value indicating whether features for large layers are to be loaded dynamically + when moving to the new portions of map. + + When set to false only the number of features set by OgrLayer.MaxFeatureCount + is loaded into memory. No further attempts to load additional features will be done.\n + + In dynamic loading mode after map extents change a check is made + whether features for the requested extents are already in memory. If not the data loading + is started in the background thread. When the loading is over all the features currently stored + in memory will be discarded. If the amount of features in new map extents exceeds + OgrLayer.MaxFeatureCount no background loading will be done. \n + + The mode is chosen automatically when the layer is opened depending on the number of features. + But afterwards it's possible possible to change the value. + Generates visualization categories for OGR layer. @@ -1926,6 +2039,39 @@ \endcode Number of styles. + + + Gets or sets an expression for label generation for the layer. + + The syntax of expression is the same as for Shapefile.Labels.Generate method. To + generate labels based on single field use "[FieldName]" syntax. The property is supported + for dynamic loading mode, where labels will be generated on the fly after each zooming + operation. + + + + + Gets or sets label orientation for polyline layers. + + \see OgrLayer.LabelExpression + + + + Gets or sets position of labels relative to their parent features. + + \see OgrLayer.LabelExpression + + + + Gets or sets maximum number of features to be loaded in the memory. + + If total number of features exceeds this number the layer will be rendered + in dynamic loading mode (see OgrLayer.DynamicLoading). During dynamic loading if + number of features for the new map extents exceeds this number they won't be loaded. The default + value of property can be changed with GlobalSettings.OgrLayerMaxFeatureCount. + + \see OgrLayer.GetBuffer + Removes style with particular name from the datasource. @@ -1933,6 +2079,13 @@ The name of the style. True on success. + + + Checks whether the layers supports saving of styles to the datasource. + + This property will check the presence of mw_styles table in the datasource and then + will try to create one if it's missing. If neither succeeds, false will be returned. + Gets name of the style with particular index. @@ -1940,23 +2093,7 @@ Index of style. Name of the style. - - - Gets a value indicating whether the layer supports editing. - - - The property works like this:\n - 1) checks whether underlying driver supports random write operation: - OgrLayer.TestCapability(tkOgrLayerCapability::olcRandomWrite);\n - 2) the presence of Feature Id column is verified;\n - 3) checks if the data is still in the same projection (OgrLayer.DataIsReprojected).\n - - OgrLayer.SaveChanges method doesn't make the first check, thus trying to write - the data even if functionality isn't advertised by driver. - - The requested type of editing. - True in case editing is supported. - + Gets a specified error message from the log registered during OgrLayer.SaveChanges call. @@ -1972,6 +2109,32 @@ Error index. Index of shape in underlying in-memory shapefile (OgrLayer.GetBuffer()). + + + Gets the number of errors registered in the log during OgrLayer.SaveChanges call. + + + + + Gets name of feature ID column. + + Feature ID column corresponds to primary key in underlying database table. + It is used to uniquely identify features and to save changes back to datasource. + Feature ID column (if present) will always be inserted as a first field of attribute + table of underlying shapefile. This field must not be edited.\n + + For inserted features the column values are set to NULL. \n + + In case underlying datasource doesn't have feature ID column, an empty string will be returned. + + + + Gets a value indicating whether underlying data ( OgrLayer.GetBuffer ) was reprojected. + + + This may happen because of projection mismatch on adding it to the map. See GlobalSettings.ReprojectLayersOnAdding for details. + + Saves local changes to the datasource. @@ -1998,173 +2161,9 @@ i.e. invalid shapes won't be saved. Result of the operation. - + - Gets GeoProjection associated with current layer. - - - Corresponds to SRID set for the layer in underlying datasource. - When SRID isn't specified (i.e. equals 0), empty GeoProjection instance will be returned. - - - - Gets the name of geometry column which was used to fetch geometry for current layer. - - Depending on data format, a layer may support several geometry columns but - only one will be used to provide shape data via OgrLayer.GetBuffer(). By default - the first column with geometry/geography type will be used. To access other columns - temporary layers can be opened via OgrDatasource.RunQuery. - - - - Gets code of the last error which took place inside this object. - - - - - Gets or sets a Callback object which handles progress and error messages. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - A text string associated with object. Any value can be stored by developer in this property. - - - - - Gets name of the layer. - - The name may correspond to table name in underlying database or store some generic string like - "sql_statement" for temporary layers opened by OgrDatasource.RunQuery. - - - - Gets shape type of the current layer. - - The property automatically maps underlying OGRwkbGeometryType to corresponding shape type. - - - - Gets "flattened" type of the current layer, i.e. Z and M components will be ignored. - - - - - Gets name of the driver which is used to access layer datasource. - - - - - Gets the array of available shape types inside OGR layer (should be cast to ShpfileType[]). - - \new494 Added in version 4.9.4 - - - - Gets or sets the type of the active shape type for the layer (is used in OgrLayer.GetBuffer for example). - - \new494 Added in version 4.9.4 - - - - Gets source type of the layer. - - Any new instance of class starts with ogrUninitialized. Successful call of OgrLayer.OpenFromDatabase - method will set it to ogrDbTable, OgrLayer.OpenFromQuery - to ogrQuery. - Source type. - - - - Extracts the last error message reported by GDAL library. - - - - - Gets or sets a value indicating whether features for large layers are to be loaded dynamically - when moving to the new portions of map. - - When set to false only the number of features set by OgrLayer.MaxFeatureCount - is loaded into memory. No further attempts to load additional features will be done.\n - - In dynamic loading mode after map extents change a check is made - whether features for the requested extents are already in memory. If not the data loading - is started in the background thread. When the loading is over all the features currently stored - in memory will be discarded. If the amount of features in new map extents exceeds - OgrLayer.MaxFeatureCount no background loading will be done. \n - - The mode is chosen automatically when the layer is opened depending on the number of features. - But afterwards it's possible possible to change the value. - - - - Gets or sets an expression for label generation for the layer. - - The syntax of expression is the same as for Shapefile.Labels.Generate method. To - generate labels based on single field use "[FieldName]" syntax. The property is supported - for dynamic loading mode, where labels will be generated on the fly after each zooming - operation. - - - - - Gets or sets label orientation for polyline layers. - - \see OgrLayer.LabelExpression - - - - Gets or sets position of labels relative to their parent features. - - \see OgrLayer.LabelExpression - - - - Gets or sets maximum number of features to be loaded in the memory. - - If total number of features exceeds this number the layer will be rendered - in dynamic loading mode (see OgrLayer.DynamicLoading). During dynamic loading if - number of features for the new map extents exceeds this number they won't be loaded. The default - value of property can be changed with GlobalSettings.OgrLayerMaxFeatureCount. - - \see OgrLayer.GetBuffer - - - - Checks whether the layers supports saving of styles to the datasource. - - This property will check the presence of mw_styles table in the datasource and then - will try to create one if it's missing. If neither succeeds, false will be returned. - - - - Gets the number of errors registered in the log during OgrLayer.SaveChanges call. - - - - - Gets name of feature ID column. - - Feature ID column corresponds to primary key in underlying database table. - It is used to uniquely identify features and to save changes back to datasource. - Feature ID column (if present) will always be inserted as a first field of attribute - table of underlying shapefile. This field must not be edited.\n - - For inserted features the column values are set to NULL. \n - - In case underlying datasource doesn't have feature ID column, an empty string will be returned. - - - - Gets a value indicating whether underlying data ( OgrLayer.GetBuffer ) was reprojected. - - - This may happen because of projection mismatch on adding it to the map. See GlobalSettings.ReprojectLayersOnAdding for details. - - - - - Facilitates interactive creation and editing of vector shapes. + Facilitates interactive creation and editing of vector shapes. @@ -2274,6 +2273,24 @@ \new493 Added in version 4.9.3 + + + Calculates the area of polygon being edited. + + Precise calculations on ellipsoid will be used if map projection is set and compatible + with WGS84. Otherwise simply Euclidean geometry will be used. + + + + Gets or sets type of the bearing to be display for line segments. + + \new493 Added in version 4.9.3 + + + + Gets or sets area display mode for polygon shapes. The default value is admNone. + + Clears the editor returning it to an empty state. @@ -2289,193 +2306,68 @@ Instance of visualization options. \see Shapefile.DefaultDrawingOptions - + - Saves any changes made by user. + Gets or sets editor behavior during the editing of existing shape, either vertex editor or part editor. - The editor will try to validate underlying shape on this call. If validation succeeds - the changes will be passed to the original shapefile or other actions defined by - current interactive tool will be triggered. - Depending on editor state the actions will be: - - esDigitize: new shape will be added to the shapefile set by ShapeEditor.LayerHandle property; - - esEdit: shapefile will be updated with modified version of shape; - - esDigitizeUnbound: a tool which started the unbound mode execute the appropriate action - (clipping, selection by polygon, etc.); - - esOverlay: current overlay operation (i.e. eoAddPart or eoRemovePart) will be discarded, editor - will return in esEdit state after which an attempt will be made to validate and save shape in regular manner. - - True on success. - \see AxMap.CursorMode, ShapeEditor.EditorState - + - Saves the state of the class to the string + Gets the state an editor is currently in. See tkEditorState enumeration for details. - A string with the state or an empty string on failure. - + - Restores the state of object from the string. + Gets or sets fill color for the shape being edited. Applies for polygon shapes only. - A string generated by ShapeEditor.Serialize() method - True on success. - + - Starts editing of a given shape in specified shapefile. + Gets or sets fill transparency for the shape being edited. Applies for polygon shapes only. - Layer handle of the shapefile. - Index of shape to edit. - True on success. - The method will populate the editor with vertices of specified shape, - hide original shape with Shapefile.put_ShapeIsHidden and set ShapeEditor.EditorState to esEdit. - + - Starts overlay operation for the current shape. + Gets or sets a Callback object which handles progress and error messages. - Editor must be in esEdit state already, i.e. ShapeEditor.StartEdit must be called first. - Type of overlay operation. - True on success. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Initializes editor for creation of unbound shape. + Returns true if editor has changes caused by user input. - Unbound shape is the one which is not linked to particular shapefile. This - method is used internally by a number of built-in tools, - like cmSelectByPolygon or cmSplitByPolyline. - Type of shape to be created. - True on success. - + - Allows to undo the last vertex entered by user. + Gets a value indicating whether calculations are performed taking into account the shape of Earth + (when map projection is defined), or on 2D plane (Euclidean geometry). - The method works when new shape is being created, i.e. ShapeEditor.IsDigitizing return true. - True on success, false if the editor is empty and there is no points to undo. - + - Gets the description of the specific error code. + Gets the length of measured path (in meters if WGS84 compatible projection is set for map and in current map units otherwise). - The error code returned by LastErrorCode property. - String with the description. - + - Gets coordinates of specified point of edited shape. + Gets or sets a value indicating whether area will be displayed during creation or editing of polygons. - Index of point. - X in projected map coordinates. - Y in projected map coordinates. - True if index of point within bounds. - + - Sets coordinates of specified point of edited shape. + Gets or sets the number of decimal degrees to be used to display area. - Index of point. - X in projected map coordinates. - Y in projected map coordinates. - True if index of point within bounds. + \new493 Added in version 4.9.3 - + - Returns directional angle (bearing) of a given segment of edited shape. + Gets or sets the number of decimal degrees to be used to display length. - Segment index to calculate angle for. - Angle in degrees. + \new493 Added in version 4.9.3 - + - Gets length of a given segment of edited shape. - - Segment index to calculate length for. - Length of segment in meters. - If map projection is set and compatible with WGS84 geodesic distance will be returned. - Otherwise Euclidean geometry will be used. - - - - Calculates the area of polygon being edited. - - Precise calculations on ellipsoid will be used if map projection is set and compatible - with WGS84. Otherwise simply Euclidean geometry will be used. - - - - Gets or sets type of the bearing to be display for line segments. - - \new493 Added in version 4.9.3 - - - - Gets or sets area display mode for polygon shapes. The default value is admNone. - - - - - Gets or sets editor behavior during the editing of existing shape, either vertex editor or part editor. - - - - - Gets the state an editor is currently in. See tkEditorState enumeration for details. - - - - - Gets or sets fill color for the shape being edited. Applies for polygon shapes only. - - - - - Gets or sets fill transparency for the shape being edited. Applies for polygon shapes only. - - - - - Gets or sets a Callback object which handles progress and error messages. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Returns true if editor has changes caused by user input. - - - - - Gets a value indicating whether calculations are performed taking into account the shape of Earth - (when map projection is defined), or on 2D plane (Euclidean geometry). - - - - - Gets the length of measured path (in meters if WGS84 compatible projection is set for map and in current map units otherwise). - - - - - Gets or sets a value indicating whether area will be displayed during creation or editing of polygons. - - - - - Gets or sets the number of decimal degrees to be used to display area. - - \new493 Added in version 4.9.3 - - - - Gets or sets the number of decimal degrees to be used to display length. - - \new493 Added in version 4.9.3 - - - - Gets or sets angle format to be used to display bearing. + Gets or sets angle format to be used to display bearing. \new493 Added in version 4.9.3 @@ -2561,6 +2453,37 @@ Gets underlying shape data without any attempt to validate it. + + + Saves any changes made by user. + + The editor will try to validate underlying shape on this call. If validation succeeds + the changes will be passed to the original shapefile or other actions defined by + current interactive tool will be triggered. + Depending on editor state the actions will be: + - esDigitize: new shape will be added to the shapefile set by ShapeEditor.LayerHandle property; + - esEdit: shapefile will be updated with modified version of shape; + - esDigitizeUnbound: a tool which started the unbound mode execute the appropriate action + (clipping, selection by polygon, etc.); + - esOverlay: current overlay operation (i.e. eoAddPart or eoRemovePart) will be discarded, editor + will return in esEdit state after which an attempt will be made to validate and save shape in regular manner. + + True on success. + \see AxMap.CursorMode, ShapeEditor.EditorState + + + + Saves the state of the class to the string + + A string with the state or an empty string on failure. + + + + Restores the state of object from the string. + + A string generated by ShapeEditor.Serialize() method + True on success. + Gets or sets the index of currently selected vertex. @@ -2589,6 +2512,41 @@ Gets or sets snapping tolerance in screen coordinates. + + + Starts editing of a given shape in specified shapefile. + + Layer handle of the shapefile. + Index of shape to edit. + True on success. + The method will populate the editor with vertices of specified shape, + hide original shape with Shapefile.put_ShapeIsHidden and set ShapeEditor.EditorState to esEdit. + + + + Starts overlay operation for the current shape. + + Editor must be in esEdit state already, i.e. ShapeEditor.StartEdit must be called first. + Type of overlay operation. + True on success. + + + + Initializes editor for creation of unbound shape. + + Unbound shape is the one which is not linked to particular shapefile. This + method is used internally by a number of built-in tools, + like cmSelectByPolygon or cmSplitByPolyline. + Type of shape to be created. + True on success. + + + + Allows to undo the last vertex entered by user. + + The method works when new shape is being created, i.e. ShapeEditor.IsDigitizing return true. + True on success, false if the editor is empty and there is no points to undo. + Validates the data stored by editor and returns it as a shape. @@ -2605,6 +2563,47 @@ Gets or sets value indicating whether vertices edited shapes are visible. + + + Gets the description of the specific error code. + + The error code returned by LastErrorCode property. + String with the description. + + + + Gets coordinates of specified point of edited shape. + + Index of point. + X in projected map coordinates. + Y in projected map coordinates. + True if index of point within bounds. + + + + Sets coordinates of specified point of edited shape. + + Index of point. + X in projected map coordinates. + Y in projected map coordinates. + True if index of point within bounds. + + + + Returns directional angle (bearing) of a given segment of edited shape. + + Segment index to calculate angle for. + Angle in degrees. + + + + Gets length of a given segment of edited shape. + + Segment index to calculate length for. + Length of segment in meters. + If map projection is set and compatible with WGS84 geodesic distance will be returned. + Otherwise Euclidean geometry will be used. + Gets number of points the shape being edited has. @@ -2702,6 +2701,21 @@ Clears all previously added operations + + + Gets the number of added operations. + + + + + A text string associated with object. Any value can be stored by developer in this property. + + + + + Gets the code of last error which took place inside this object. + + Removes operations with specified index. @@ -2764,22 +2778,38 @@ Index of operation to check the property for. Reason for invalidity or fovValid in operation is applicable. - + + - Gets the number of added operations. + Gets or sets a Callback object which handles progress and error messages. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + A text string associated with object. Any value can be stored by developer in this property. - + Gets the code of last error which took place inside this object. - + + + Gets filename of the last datasource that was attempted to be opened. + + + + + Gets a value indicating whether the last attempt to open a datasource was successful. + + + + + Gets a strategy that was used on last attempt to open datasource. + + Tries to open datasource with specified name. @@ -2923,79 +2953,48 @@ Filename of grid datasource. True if proxy images exist. - + - Tries to open specified file as OGR datasource. + Gets expression to be set for OpenFileDialog.Filter property to select supported datasources. - Filename of the datasource to be opened. - Instance of OgrDatasource or null on failure. \new493 Added in version 4.9.3 - + - Tries to open specified file as OGR layer. + Gets expression to be set for OpenFileDialog.Filter property to select raster datasources (both RGB images and grids). - When preferedShapeType is set to default ShpfileType.SHP_NULLSHAPE value or there is no layer - with preferedShapeType, then the first layer in datasource will be returned. - Filename of the datasource to be opened. - Sets type of layer to be returned from datasource in case there are multiple layers available. - True in case layer should be open in read/write mode. - Instance of OgrLayer or null on failure. \new493 Added in version 4.9.3 - + - Gets or sets a Callback object which handles progress and error messages. + Gets expression to be set for OpenFileDialog.Filter property to select vector datasources. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + \new493 Added in version 4.9.3 - - - A text string associated with object. Any value can be stored by developer in this property. - - - - - Gets the code of last error which took place inside this object. - - - - - Gets filename of the last datasource that was attempted to be opened. - - - - - Gets a value indicating whether the last attempt to open a datasource was successful. - - - - - Gets a strategy that was used on last attempt to open datasource. - - - - - Gets expression to be set for OpenFileDialog.Filter property to select supported datasources. - - \new493 Added in version 4.9.3 - - + - Gets expression to be set for OpenFileDialog.Filter property to select raster datasources (both RGB images and grids). + Gets string with the list of supported GDAL formats. \new493 Added in version 4.9.3 - + - Gets expression to be set for OpenFileDialog.Filter property to select vector datasources. + Tries to open specified file as OGR datasource. + Filename of the datasource to be opened. + Instance of OgrDatasource or null on failure. \new493 Added in version 4.9.3 - + - Gets string with the list of supported GDAL formats. + Tries to open specified file as OGR layer. + When preferedShapeType is set to default ShpfileType.SHP_NULLSHAPE value or there is no layer + with preferedShapeType, then the first layer in datasource will be returned. + Filename of the datasource to be opened. + Sets type of layer to be returned from datasource in case there are multiple layers available. + True in case layer should be open in read/write mode. + Instance of OgrLayer or null on failure. \new493 Added in version 4.9.3 @@ -3039,13 +3038,6 @@ The copy of the field. \new48 Added in version 4.8 - - - Retrieves the error message associated with the specified error code. - - The error code for which the error message is required. - The error message description for the specified error code. - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. @@ -3116,6 +3108,13 @@ Gets or sets the width of the field. + + + Retrieves the error message associated with the specified error code. + + The error code for which the error message is required. + The error message description for the specified error code. + Holds information about coordinate system and projection of the data. @@ -3218,6 +3217,18 @@ The string with WKT projection. + + + Returns the name of the coordinate system. + + An empty string will be returned unless GeoProjection.IsGeographic property returns true. + + + + Gets or sets a callback object which is used to report errors. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + Initializes geoprojection from the input string of arbitrary format. @@ -3254,6 +3265,55 @@ The string in the OGC WKT format. True on success and false otherwise. + + + Returns the inverse flattening of the reference ellipsoid of the coordinate system. + + + + + Gets a boolean value which indicates whether any projection definition is stored in the object. + + + + + Gets a boolean value which indicates whether the coordinate system stored in the object is the geographic one. + + + + + Gets a boolean value which indicates whether the coordinate system stored in the object is the local one. + + + + + Gets a boolean value which indicates whether the coordinate system stored in the object is the projected one. + + + + + A text string associated with the instance of the class. Any value can be stored by developer in this property. + + + + + Retrieves the numeric code of the last error that took place in the class. + + The usage of this property clears the error code. + + + + Returns the name of the coordinate system. + + Either GeoProjection.GeogCSName or GeoProjection.ProjectionName will be returned + depending on the type of coordinate system. + + + + The name of the projected coordinate system. + + An empty string will be returned unless GeoProjection.IsProjected property returns true. + Initializes geoprojection from the specified file. @@ -3263,6 +3323,16 @@ The name of the file to read projection string from. True on success and false otherwise. + + + Returns the half of the major axis of the reference ellipsoid. + + + + + Returns the half of the minor axis of the reference ellipsoid. + + Initializes the object with NAD83 projection specified by enumerated constant. @@ -3337,6 +3407,11 @@ The returned value of the parameter. True on success and false otherwise. + + + Gets a value indicating whether transformation to some target projection was opened with GeoProjection.StartTransform() call. + + Opens transformation to the specified target projection. The transformation will be used by GeoProjection. @@ -3375,6 +3450,16 @@ as ExportToWKT may add defaults for parameters missing in initial Proj4 definition. \new491 Added in version 4.9.1 + + + Gets a value indicating whether the object can be changed. + + + When frozen all the methods which can change the inner state of object will fail. + The property is set to true for map projection applied with AxMap.SetGeoProjection (see details there). + + \new491 Added in version 4.9.1 + Sets so called Google Mercator projection (aka Spherical Mercator; EPSG:3857), @@ -3404,6 +3489,11 @@ True on success. \new491 Added in version 4.9.1 + + + Gets the linear units from projection definition. + + Writes projection string to a file. @@ -3429,97 +3519,6 @@ Resulting string. \new494 Added in version 4.9.4 - - - Returns the name of the coordinate system. - - An empty string will be returned unless GeoProjection.IsGeographic property returns true. - - - - Gets or sets a callback object which is used to report errors. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Returns the inverse flattening of the reference ellipsoid of the coordinate system. - - - - - Gets a boolean value which indicates whether any projection definition is stored in the object. - - - - - Gets a boolean value which indicates whether the coordinate system stored in the object is the geographic one. - - - - - Gets a boolean value which indicates whether the coordinate system stored in the object is the local one. - - - - - Gets a boolean value which indicates whether the coordinate system stored in the object is the projected one. - - - - - A text string associated with the instance of the class. Any value can be stored by developer in this property. - - - - - Retrieves the numeric code of the last error that took place in the class. - - The usage of this property clears the error code. - - - - Returns the name of the coordinate system. - - Either GeoProjection.GeogCSName or GeoProjection.ProjectionName will be returned - depending on the type of coordinate system. - - - - The name of the projected coordinate system. - - An empty string will be returned unless GeoProjection.IsProjected property returns true. - - - - Returns the half of the major axis of the reference ellipsoid. - - - - - Returns the half of the minor axis of the reference ellipsoid. - - - - - Gets a value indicating whether transformation to some target projection was opened with GeoProjection.StartTransform() call. - - - - - Gets a value indicating whether the object can be changed. - - - When frozen all the methods which can change the inner state of object will fail. - The property is set to true for map projection applied with AxMap.SetGeoProjection (see details there). - - \new491 Added in version 4.9.1 - - - - Gets the linear units from projection definition. - - An interface for callback objects which can be used to return information about progress and errors. @@ -3571,62 +3570,13 @@ Such properties may be removed afterwards (GlobalSettings.ShapefileFastUnion for example). \new48 Added in version 4.8 - + - Clears information about last GDAL error. + Gets a sets a value which defines the multiplication coefficient for data in decimal degrees. - Affects GdalLastErrorMsg, GdalLastErrorNo, GdalLastErrorType, GdalReprojectionErrorMsg properties. + The value is used for Clipper library due to the lack of built-in scaling in it. The default value is 10000.0. - - - Gets the localized version for a specified string used in GUI. - - String to get localized version for. - Localized string. - \new491 Added in version 4.9.1 - - - - Sets the localized version for a specified string used in GUI. - - String to set localized version for. - Localized string. - \new491 Added in version 4.9.1 - - - - Sets application credentials for Here Maps online tiles. - Without these credentials Here Maps providers are not available. See - details here. - - Application Id. Can be obtained by registering on the site of the service. - Application code. Can be obtained by registering on the site of the service. - \new493 Added in version 4.9.3 - - - - Requests URL address for tiles download from Bing Maps server. - - API key to test. - True if the Url for downloading for obtained. - \new493 Added in version 4.9.3 - - - - Starts logging of tile requests. - - The filename. - If set to true only errors will be logged. - True on success. - \new494 Added in version 4.9.4 - - - - Gets a sets a value which defines the multiplication coefficient for data in decimal degrees. - - The value is used for Clipper library due to the lack of built-in scaling in it. The default value is 10000.0. - - + Gets or sets a value which is used to weed out long narrow "splintered" polygons generated by geoprocessing routines. @@ -3682,6 +3632,12 @@ The default value is HighQualityMode. + + + Clears information about last GDAL error. + + Affects GdalLastErrorMsg, GdalLastErrorNo, GdalLastErrorType, GdalReprojectionErrorMsg properties. + Gets or sets a value which affects the speed of Shapefile.Union operation. @@ -3736,6 +3692,22 @@ \new491 Added in version 4.9.1 + + + Gets the localized version for a specified string used in GUI. + + String to get localized version for. + Localized string. + \new491 Added in version 4.9.1 + + + + Sets the localized version for a specified string used in GUI. + + String to set localized version for. + Localized string. + \new491 Added in version 4.9.1 + Gets or sets colour scheme to be used for rendering grids. @@ -3983,6 +3955,24 @@ \new493 Added in version 4.9.3 + + + Sets application credentials for Here Maps online tiles. + Without these credentials Here Maps providers are not available. See + details here. + + Application Id. Can be obtained by registering on the site of the service. + Application code. Can be obtained by registering on the site of the service. + \new493 Added in version 4.9.3 + + + + Requests URL address for tiles download from Bing Maps server. + + API key to test. + True if the Url for downloading for obtained. + \new493 Added in version 4.9.3 + Gets or sets the value indicating which compression mode will be used to compress image overviews. @@ -4055,6 +4045,22 @@ \new494 Added in version 4.9.4 + + + Share connection between layers (may be unstable). + For large read-only layers it will increase performance. + + \new494 Added in version 4.9.4 + + + + Starts logging of tile requests. + + The filename. + If set to true only errors will be logged. + True on success. + \new494 Added in version 4.9.4 + @@ -4063,6 +4069,11 @@ Projection string in proj4 format. True on success or false otherwise. + + + Returns the common dialog filter containing all supported file extensions in string format. + + Uses a cell's column and row position to find the center of the cell in projected map coordinates. @@ -4099,6 +4110,16 @@ Optional. The ICallback object that will receive the progress and error events during the creation of the new grid. A boolean value representing the success or failure of the creation of the new grid. + + + Returns the data type of the values stored in the grid. + + + + + The filename associated with the object. + + Returns an array with grid values which lie within specified bounds. @@ -4124,6 +4145,32 @@ Reference to the first element of the array of floats that will hold the row of values. True on success and false otherwise. + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + Returns the header of the grid. + + + + + Returns whether the grid is loaded in to RAM memory or not. + + + + + The key may be used by the programmer to store any string data associated with the object. + + + + + Retrieves the last error generated in the object. + + Opens a grid. @@ -4173,6 +4220,12 @@ Reference to the first element of the array of floats that will hold the row of values. True on success. + + + Gets grid colour scheme object used for rendering of the image representation of the grid, in case + the datasource has a color table (GTiff with indexed colors, for example). + + Changes the grid source without closing it. @@ -4222,6 +4275,21 @@ The index of the cell's row. The new value as variant data type. + + + The index of the active band within grid. + + Active band will be used on data extraction operation like Grid.get_Value, Grid.GetFloatWindow + and during creation of image proxy. + \new490 Added in version 4.9.0 + + + + Gets the value indicating whether grid source can be displayed by Image class without creation of proxy file. + + Check return value for the reason whey such rendering isn't possible. + \new491 Added in version 4.9.1 + Creates a proxy image file to display grid data. @@ -4231,6 +4299,12 @@ The format of proxy can be changed in GlobalSettings.GridProxyFormat. \new491 Added in version 4.9.1 + + + Gets extents of the grid. + + \new490 Added in version 4.9.0 + Generates colour scheme for the grid. @@ -4240,6 +4314,30 @@ Generated colour scheme or null if the operation failed. \new491 Added in version 4.9.1 + + + Gets the value indicating whether grid has a valid image proxy for visualization. + + To be considered valid the proxy must have proper name (with "_proxy" postfix) and colour scheme file (.mwleg). + Both this files must have older creation date than the grid source file itself. + \new491 Added in version 4.9.1 + + + + Returns the maximum value stored in the grid. + + + + + Returns the minimum value stored in the grid. + + + + + Gets the number of within the grid. + + \new490 Added in version 4.9.0 + Opens grid as image. @@ -4259,6 +4357,13 @@ True on success and false otherwise. \new490 Added in version 4.9.0 + + + Gets or sets the value indicating how the grid should be displayed. + + This value will be used in AxMap.AddLayer and Grid.OpenAsImage methods. + \new491 Added in version 4.9.1 + Removes proxy image file created for grid display. @@ -4287,6 +4392,13 @@ Color scheme or null if both retrieval and generation failed. \new491 Added in version 4.9.1 + + + Gets the type of grid source, which defines a) whether any grid source is opened and b) if so, what the inner representation of grid by MapWinGIS. + + The functionality and behaviour of various source types may differ. + \new490 Added in version 4.9.0 + Returns an array with grid values which lie within specified bounds. Double overload of Grid.GetFloatWindow method. @@ -4349,123 +4461,68 @@ The band or null if index is not valid. \new494 Added in version 4.9.4 - + - Returns the common dialog filter containing all supported file extensions in string format. + Gets the active band of the datasource. + \new494 Added in version 4.9.4 - + - Returns the data type of the values stored in the grid. + A grid color break object defines how a specified region of a grid will be colored. + Represents a part of the GridColorScheme. - + - The filename associated with the object. + Gets or sets the caption to display for the color break - + + + Gets or sets the way a break is colored. + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Returns the header of the grid. + Gets or sets the model used to color the break. - + - Returns whether the grid is loaded in to RAM memory or not. + Gets or sets the color representing the highest value in the color break. - + - The key may be used by the programmer to store any string data associated with the object. + Gets or sets the highest value in the color break. - + - Retrieves the last error generated in the object. + The key may be used by the programmer to store any string data associated with the object. - + - Gets grid colour scheme object used for rendering of the image representation of the grid, in case - the datasource has a color table (GTiff with indexed colors, for example). + Retrieves the last error generated in the object. - + - The index of the active band within grid. + Gets or sets the lowest value in the color break. - Active band will be used on data extraction operation like Grid.get_Value, Grid.GetFloatWindow - and during creation of image proxy. - \new490 Added in version 4.9.0 - - - Gets the value indicating whether grid source can be displayed by Image class without creation of proxy file. - - Check return value for the reason whey such rendering isn't possible. - \new491 Added in version 4.9.1 - - - - Gets extents of the grid. - - \new490 Added in version 4.9.0 - - - - Gets the value indicating whether grid has a valid image proxy for visualization. - - To be considered valid the proxy must have proper name (with "_proxy" postfix) and colour scheme file (.mwleg). - Both this files must have older creation date than the grid source file itself. - \new491 Added in version 4.9.1 - - - - Returns the maximum value stored in the grid. - - - - - Returns the minimum value stored in the grid. - - - - - Gets the number of within the grid. - - \new490 Added in version 4.9.0 - - - - Gets or sets the value indicating how the grid should be displayed. - - This value will be used in AxMap.AddLayer and Grid.OpenAsImage methods. - \new491 Added in version 4.9.1 - - - - Gets the type of grid source, which defines a) whether any grid source is opened and b) if so, what the inner representation of grid by MapWinGIS. - - The functionality and behaviour of various source types may differ. - \new490 Added in version 4.9.0 - - - - Gets the active band of the datasource. - - \new494 Added in version 4.9.4 - - + - A grid color break object defines how a specified region of a grid will be colored. + Gets or sets the lowest value in the color break. - Represents a part of the GridColorScheme. @@ -4474,106 +4531,101 @@ The error code for which the error message is required. The error message description for the specified error code. - - - Gets or sets the caption to display for the color break - - - + - Gets or sets the way a break is colored. + Gets or sets a value indicating whether the break is visible. + \new494 Added in version 4.9.4 - + - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + A grid color scheme defines how a grid will be colored. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + A grid color scheme may either contain grid color breaks created by + the user, or may use a predefined color scheme. - + - Gets or sets the model used to color the break. + Gets or sets the intensity of the ambient lighting for the color scheme. Only applies when creating hillshaded breaks. - + - Gets or sets the color representing the highest value in the color break. + Clears all color breaks in the color scheme. - + - Gets or sets the highest value in the color break. + Deletes the specified color break from the color scheme. + The index of the color break to be removed. - + - The key may be used by the programmer to store any string data associated with the object. + Restores the setings of the grid from the string generated by Grid.Serialize() method. + The string with grid settings. - + - Retrieves the last error generated in the object. + Gets the direction the light source is pointing for the color scheme in the form of a vector which originates from the light + source. This only applies to hillshaded breaks. + The direction the light source is pointing represented by a vector. - + - Gets or sets the lowest value in the color break. + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Gets or sets the lowest value in the color break. + Inserts a break at the specified position of the color scheme. + The position to insert the break at. + The grid color break. - + - Gets or sets a value indicating whether the break is visible. + Adds a break to the color scheme. - \new494 Added in version 4.9.4 + The grid color break. - + - A grid color scheme defines how a grid will be colored. + The key may be used by the programmer to store any string data associated with the object. - A grid color scheme may either contain grid color breaks created by - the user, or may use a predefined color scheme. - + - Clears all color breaks in the color scheme. + Retrieves the last error generated in the object. - + - Deletes the specified color break from the color scheme. + Gets the azimuth, or compass heading of the light source. Only applies to hillshaded breaks. - The index of the color break to be removed. - + - Restores the setings of the grid from the string generated by Grid.Serialize() method. + Gets the elevation of the light source. Only applies to hillshaded breaks. - The string with grid settings. - + - Gets the direction the light source is pointing for the color scheme in the form of a vector which originates from the light - source. This only applies to hillshaded breaks. + Gets or sets the intensity of the light source for the color scheme. Only applies to hillshaded breaks. - The direction the light source is pointing represented by a vector. - + - Inserts a break at the specified position of the color scheme. + The color to use for the color scheme when drawing grid cells with a no-data value. - The position to insert the break at. - The grid color break. - + - Adds a break to the color scheme. + Gets the number of color breaks in the color scheme. - The grid color break. @@ -4654,55 +4706,14 @@ True on suceess. \new494 Added in version 4.9.4 - - - Gets or sets the intensity of the ambient lighting for the color scheme. Only applies when creating hillshaded breaks. - - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - The key may be used by the programmer to store any string data associated with the object. - - - - - Retrieves the last error generated in the object. - - - - - Gets the azimuth, or compass heading of the light source. Only applies to hillshaded breaks. - - - - - Gets the elevation of the light source. Only applies to hillshaded breaks. - - - - - Gets or sets the intensity of the light source for the color scheme. Only applies to hillshaded breaks. - - - - - The color to use for the color scheme when drawing grid cells with a no-data value. - - - + - Gets the number of color breaks in the color scheme. + A grid header object is used to hold the information contained in a grid's header - + - A grid header object is used to hold the information contained in a grid's header + Gets or sets a text string with information about color table. This value doesn't affect grid processing. @@ -4711,23 +4722,6 @@ The grid header to copy setting from. - - - Retrieves the error message associated with the specified error code. - - The error code for which the error message is required. - The error message description for the specified error code. - - - - For inner use only. - - - - - Gets or sets a text string with information about color table. This value doesn't affect grid processing. - - Not implemented. Get or sets the geoprojection associated with grid header. @@ -4795,11 +4789,24 @@ Gets or sets the height of a cell in the grid represented by the grid header. + + + Retrieves the error message associated with the specified error code. + + The error code for which the error message is required. + The error message description for the specified error code. + + + + For inner use only. + + Represents an raster image of particular format which may be added to the map. - \dot digraph image_diagram { + \dot + digraph image_diagram { nodesep = 0.3; ranksep = 0.3; splines = ortho; @@ -4843,6 +4850,28 @@ Some properties and methods are applicable to the GDAL images only.\n + + \addtogroup image_gdal GDAL images + Here is a list of methods and properties that are specific for images accessed through GDAL library. + The properties and methods described here belong to Image class. + \dot + digraph image_common { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Image" URL="\ref Image"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="GDAL images" URL="\ref image_common"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + + Gets or sets the size of image buffer in percentage. + + The values less than 100 will increase performance of drawing at the cost of decreasing the visual quality. + Converts the position of pixel in image buffer to the map coordinates. @@ -4866,6 +4895,12 @@ True on success and false otherwise. \new48 Added in version 4.8 + + + Clears the cache of GDAL library which can be used for faster display. + + \new48 Added in version 4.8 + Loads the whole image in the memory buffer of specified size. Applicable for GDAL images only. @@ -4876,15 +4911,48 @@ True on successful loading and false otherwise. \new48 Added in version 4.8 - + - Sets no-data value for the image. Applicable for GDAL images only. + Returns the number of bands of GDAL image. - The pixels with this value will be treated as transparent. - The value to be set. + + + + Returns the number of overviews for GDAL image. + + \see Image.BuildOverviews. + \new48 Added in version 4.8 + + + + Gets the type of palette interpretation. Applicable for GDAL images only. + + The possible values are + - "Grayscale"; + - "Red, Green, Blue and Alpha"; + - "Cyan, Magenta, Yellow and Black"; + - "Hue, Lightness and Saturation"; + - "Unknown". + + + + Gets or sets a boolean value which indicates whether a histogram will be used. Applicable for GDAL images only. + + + + + Sets no-data value for the image. Applicable for GDAL images only. + + The pixels with this value will be treated as transparent. + The value to be set. A boolean output value which indicates the success of the operation. \new48 Added in version 4.8 + + + Returns a boolean value which indicates whether an image has a color table. Applicable for GDAL images only. + + Reloads the image buffer to represent the specified map extents. Applicable for GDAL images only. @@ -4898,6 +4966,49 @@ The number of image pixels which fall into the specified extents. This parameter is no longer used. + + + Returns true if the datasource represents RGB image. + + The property can be used to distinguish grid datasource from genuine images. + Implementation checks if all 3 R,G,B colors are set as color interpretation for GDAL bands. + Any additional bands will be ignored. + \new491 Added in version 4.9.1 + + + + Returns true if the image is warped, i.e. there are rotation parameters in world file. + + \new490 Added in version 4.9.0 + + + \addtogroup image_common Image common + Here is a list of methods and properties that are common for all images despite their source. + The properties and methods described here belong to Image class. + \dot + digraph image_management { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Image" URL="\ref Image"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Open and close" URL="\ref image_common"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + + Returns the filename of the datasource for an image. + + For proxy image grid filename will be renamed, in other cases Filename of Image itself. + \new491 Added in version 4.9.1 + + + + Returns the common dialog filter containing all supported file extensions in string format. + + Clears the image using the specified canvas color as the new color for every pixel in the image. @@ -4929,6 +5040,11 @@ The serialized string generated by Image.Serialize() method. \new48 Added in version 4.8 + + + The filename associated with the object. + + Opens an image from file. @@ -4941,6 +5057,16 @@ Optional. The ICallback object which will receive progress and error events while the image is being opened. A boolean value representing the success or failure of opening the image. + + + Gets the image object's image type. + + + + + Returns true when the image is loaded in RAM memory, and returns false when the image is not loaded in RAM memory. + + Changes the data source of the image object without the its closing. @@ -4966,6 +5092,31 @@ The serialized string. \new48 Added in version 4.8 + + + Gets or sets instance of the labels class associated with the image. + + \new48 Added in version 4.8 + + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + The key may be used by the programmer to store any string data associated with the object. + + + + + The source type of the image. + + Images start with istUninitialized state. After loading bmp images istDiskBased or istInMemory value will be set depending + on the value of inMem parameter. For GDAL images istGDALBased will be set. + \new48 Added in version 4.8 + Retrieves the error message associated with the specified error code. @@ -4973,7 +5124,54 @@ The error code for which the error message is required. The error message description for the specified error code. + + + Retrieves the last error generated in the object. + + + + + Gets or sets a boolean value which indicates how images with identical size and position on the map will be drawn. + + When set to true such images will be merged into a single bitmap. This may improve performance + in case of low number of data pixels (those which differ from the transparent color). The default value is false. + \new48 Added in version 4.8 + + + + Returns file handle for BMP image. For inner use only. + + + + + Get or sets an instance of GeoProjection class associated with the image. + + The property can't be set to NULL (there is always an instance of GeoProjection class associated with image). + \new493 Added in version 4.9.3 + + + + Returns true if image object is empty, i.e. not bound to some disk-based datasource and doesn't hold any in-memory data. + This property is the same as checking Image.SourceType = istUninitialized. + + + \addtogroup image_position Image position + Here is a list of methods and properties which affect position and scale of image, conversion between map units and image coordinates. + The properties and methods described here belong to Image class. + \dot + digraph image_management { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Image" URL="\ref Image"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Position" URL="\ref image_position"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Retrieves projection string from the associated .prj file. @@ -4987,6 +5185,16 @@ The projection string. True on success and false otherwise. + + + Returns the extents of the image. + + + + + Gets the height of the image in pixels. + + Converts coordinates of image's pixel to the screen coordinates. @@ -4997,6 +5205,48 @@ The resulting y coordinate of the map. \new48 Added in version 4.8 + + + Gets or sets the number of map units per image pixel for x axis. + + The changes of this value will result in scaling of the image horizontally. + \new48 Added in version 4.8 + + + + Gets or sets the number of map units per image pixel for y axis. + + The changes of this value will result in scaling of the image vertically. + \new48 Added in version 4.8 + + + + Gets the height of the image. + + This property should be used to return the total height of the image, as compared to the height of the image buffer. + The height of the image in pixels. + \new48 Added in version 4.8 + + + + Gets the width of the image. + + This property should be used to return the total width of the image, as compared to the width of the image buffer. + The width of the image in pixels. + \new48 Added in version 4.8 + + + + Gets or sets the x coordinate of the center of lower left pixel of the image in map units. + + \new48 Added in version 4.8 + + + + Gets or sets the y coordinate of the center of lower left pixel of the image in map units. + + \new48 Added in version 4.8 + Returns the coordinates of pixel in image buffer which correspond to the given point on the map. @@ -5017,7 +5267,50 @@ The row. \new48 Added in version 4.8 + + + Gets the width of the image in pixels. + + + + + Gets or sets the x coordinate of the center of the lower-left pixel in the image. + + + + + Gets or sets the y coordinate of the center of the lower-left pixel in the image. + + + + + Gets or sets the number of map units per pixel of image buffer for x axis. + + The set part of the property is not applicable for GDAL images. + + + + Gets or sets the number of map units per pixel of image buffer for y axis. + + The set part of the property is not applicable for GDAL images. + + \addtogroup image_visualization Image visualization + Here is a list of properties that affect the visualization of the image. + The properties and methods described here belong to Image class. + \dot + digraph image_visualization { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Image" URL="\ref Image"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Visualization" URL="\ref image_visualization"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Sets transparent color for image. @@ -5026,37 +5319,98 @@ It also set Image.UseSetTranparencyColor to true. \new491 Added in version 4.9.1 - + - Gets the data from the image and puts it into the selected bitmap in the specified device context. + The interpolation mode for images which are displayed with the resolution higher than original, i.e. after zoom in (down). - This function requires the width and height of the selected bitmap and the image to match. - Use of this function requires advanced knowledge in windows graphics concepts and is intended for advanced users only. - The handle to the device context. - A boolean value representing the success or failure of getting the device context handle for the image. - + - This function uses a bitmap selected in the specified device context handle as the data to copy into the image for which the - function is called. - This function requires the image to be the same width and height as the bitmap selected in the device context. - Use of this function requires advanced knowledge in windows graphics concepts and is intended for advanced users only. - The device context handle of the device context for which the selected bitmap is to be used to - copy the bits into the image used to call the function. - A boolean value representing success or failure of setting the image's bits using the bitmap - selected in the specified device context. + Gets or sets the drawing method of image. + + Was used temporarily while moving from GDI to GDI+ drawing. + \deprecated v 4.8. No longer used. - + - Gets a row of pixels from the image. + A boolean value which indicates whether an image will be displayed using a gray palette. - The row of pixels you want to get from the image. - An array which will return the pixels in the specified row of the image. - A boolean value representing the success or failure of getting the row of pixels from the image. - + - Returns the arrays with the unique colors of the image and their frequencies. + Gets or sets a color which is used as the transparency color for the image. + + + + + Gets or sets a second color which is used as the transparency color for the image. + + All the colors between TransparencyColor and TransparencyColor2 will be transparent. + This "between" relation is calculated for each color channel and then the results are combined by AND operation. + + + + Gets or sets the value which define alpha component of image colors (0.0-1.0). + + The values range from 0.0(fully transparent) to 1.0(fully opaque). + + + + The interpolation mode for images which are displayed with the resolution lower than original, i.e. after zooming out (up). + + + + + Gets or sets whether or not the transparency color is being used when the image is displayed. + + + + \addtogroup image_data Data access + Here is a list of methods and properties which provide access to the values of pixels. + The properties and methods described here belong to Image class. + \dot + digraph image_data { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Image" URL="\ref Image"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Data access" URL="\ref image_data"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + + Gets the data from the image and puts it into the selected bitmap in the specified device context. + + This function requires the width and height of the selected bitmap and the image to match. + Use of this function requires advanced knowledge in windows graphics concepts and is intended for advanced users only. + The handle to the device context. + A boolean value representing the success or failure of getting the device context handle for the image. + + + + This function uses a bitmap selected in the specified device context handle as the data to copy into the image for which the + function is called. + This function requires the image to be the same width and height as the bitmap selected in the device context. + Use of this function requires advanced knowledge in windows graphics concepts and is intended for advanced users only. + The device context handle of the device context for which the selected bitmap is to be used to + copy the bits into the image used to call the function. + A boolean value representing success or failure of setting the image's bits using the bitmap + selected in the specified device context. + + + + Gets a row of pixels from the image. + + The row of pixels you want to get from the image. + An array which will return the pixels in the specified row of the image. + A boolean value representing the success or failure of getting the row of pixels from the image. + + + + Returns the arrays with the unique colors of the image and their frequencies. For large images it's recommended to perform the operation with the smaller size of buffer to improve performance and possible RAM overuse. @@ -5065,6 +5419,11 @@ The output array of the same size with Colors array with the frequency of the each color. The number of unique colors. + + + Gets or sets the picture object. + + Gets the value of a pixel in the image. @@ -5081,6 +5440,29 @@ The column in the image for which the value is required. The value of the specified pixel in the image. + + + + Gets or sets the color scheme to render image with. + + This property should be used for grid datasources in the first place (when there is no build-in colors). + But may also be used for a single band of regular RGB/ARGB images for synthetic colors and hillshading. + When no custom color scheme is set, grid rendering is chosen the color scheme from Image.ImageColorScheme will be used. + \new491 Added in version 4.9.1 + + + + Gets the value which indicates whether an image object represents a visualization proxy for another datasource. + + Will return true if the image was opened with Grid.OpenAsImage only. When opened directly the link to the source grid will be lost. + \new491 Added in version 4.9.1 + + + + Returns true if the image is rendered as grid. + + \new491 Added in version 4.9.1 + Opens the datasource of the image as grid. @@ -5090,6 +5472,27 @@ otherwise the datasource of image itself. \new491 Added in version 4.9.1 + + + Gets the name of the source grid in case the image represent a visualization proxy for a grid. + + \new490 Added in version 4.9.0 + + + + Gets or sets index of band within datasource whose values should be used to apply color scheme. + + Other bands will ignored during display process. This is useful for multiband grids (e.g. NetCDF), + but may also be used with RGB images, to set synthetic colors for a single band. + \new491 Added in version 4.9.1 + + + + Indicate whether hillshade algorithm will be used for generation of image representation of the grid. + + The behaviour has changed in v4.9. Now when active it only switches ColoringType from Hillshade to Gradient. + In v.4.8. it used to have the same behaviour as Image.AllowExternalColorScheme. + Sets color scheme to use in process of generation of the image representation of the grid. @@ -5097,7 +5500,23 @@ The color scheme. True on success and false otherwise. + + + Gets or sets the predefined color scheme for the image. Applicable for GDAL images only. + + The color scheme is used for generation of image representation of the grid. + + + + Gets grid color scheme this proxy image was generated with. The method should be called for proxy images only: Image.IsGridProxy = true. + + Color scheme will be read from .mwleg XML file on the disk. + + \addtogroup image_newmembers New members + Here is a list of properties and methods added in the version 4.9.4. + The properties and methods described here belong to Image class.\n\n + @{ Gets the band with the specified index. @@ -5105,3278 +5524,3367 @@ Raster band. \new494 Added in version 4.9.4 - + - Gets the minimum value for the specified band. + Gets the GDAL driver which manages the current datasource. - Index of the band. \new494 Added in version 4.9.4 - + - Gets the maximum value for the specified band. + Gets the active band (the one used for rendering when grid rendering is on). - Index of the band. \new494 Added in version 4.9.4 - + - Gets the value of the specified pixel including the alpha component. + Gets the palette interpretation for the image. - The row. - The column. - 32bit unsigned integer value. \new494 Added in version 4.9.4 - + - Sets the value of the specified pixel including the alpha component. + Gets or sets the brightness of the image. - The row. - The column. - The value to set. \new494 Added in version 4.9.4 - + - Clears the overviews for the datasource. + Gets or sets the contrast of the image. \new494 Added in version 4.9.4 - + - Sets the band minimum maximum values for the band. Values outside of this range will not be rendered. + Gets or sets the saturation of the image. - Index of the band. - The minimum. - The maximum. - True on success. \new494 Added in version 4.9.4 - + - Calculates the minimum and maximum values for the specified band and caches them for further use. + Gets or sets the hue of the image. - Index of the band. - True on success. \new494 Added in version 4.9.4 - + - Gets or sets the size of image buffer in percentage. + Gets or sets the gamma correction value for the image. - The values less than 100 will increase performance of drawing at the cost of decreasing the visual quality. + \new494 Added in version 4.9.4 - + - Clears the cache of GDAL library which can be used for faster display. + Gets or sets the colorize intensity. - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - Returns the number of bands of GDAL image. + Gets or sets the color of the colorize. + \new494 Added in version 4.9.4 - + - Returns the number of overviews for GDAL image. + Gets or sets the index of the red band (used when RGB rendering is chosen). - \see Image.BuildOverviews. - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - Gets the type of palette interpretation. Applicable for GDAL images only. + Gets or sets the index of the green band (used when RGB rendering is chosen). - The possible values are - - "Grayscale"; - - "Red, Green, Blue and Alpha"; - - "Cyan, Magenta, Yellow and Black"; - - "Hue, Lightness and Saturation"; - - "Unknown". + \new494 Added in version 4.9.4 - + - Gets or sets a boolean value which indicates whether a histogram will be used. Applicable for GDAL images only. + Gets or sets the index of the blue band (used when RGB rendering is chosen). + \new494 Added in version 4.9.4 - + - Returns a boolean value which indicates whether an image has a color table. Applicable for GDAL images only. + Gets or sets a value indicating whether RGB band mapping will be used. + \see RedBandIndex, GreenBandIndex, BlueBandIndex, AlphaBandIndex + \new494 Added in version 4.9.4 - + - Returns true if the datasource represents RGB image. + Gets or sets a value indicating whether the band + set by Image.ActiveBandIndex will be used rather then RGB rendering. - The property can be used to distinguish grid datasource from genuine images. - Implementation checks if all 3 R,G,B colors are set as color interpretation for GDAL bands. - Any additional bands will be ignored. - \new491 Added in version 4.9.1 + \new494 Added in version 4.9.4 - + - Returns true if the image is warped, i.e. there are rotation parameters in world file. + Gets or sets the index of the alpha band. - \new490 Added in version 4.9.0 + \new494 Added in version 4.9.4 - + - Returns the filename of the datasource for an image. + Gets or sets a value indicating whether to use active band as an alpha band as well. - For proxy image grid filename will be renamed, in other cases Filename of Image itself. - \new491 Added in version 4.9.1 + \new494 Added in version 4.9.4 - + - Returns the common dialog filter containing all supported file extensions in string format. + Gets the minimum value for the specified band. + Index of the band. + \new494 Added in version 4.9.4 - + - The filename associated with the object. + Gets the maximum value for the specified band. + Index of the band. + \new494 Added in version 4.9.4 - + - Gets the image object's image type. + Gets or sets a value indicating whether colors should be reversed during gray scale rendering (i.e. the smallest values are white). + \new494 Added in version 4.9.4 - + - Returns true when the image is loaded in RAM memory, and returns false when the image is not loaded in RAM memory. + Gets or sets a value indicating whether built-in color table of the image will be ignored. + \new494 Added in version 4.9.4 - + - Gets or sets instance of the labels class associated with the image. + Gets the current rendering mode for the image (depends on the values of other properties). - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + Gets the value of the specified pixel including the alpha component. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + The row. + The column. + 32bit unsigned integer value. + \new494 Added in version 4.9.4 - + - The key may be used by the programmer to store any string data associated with the object. + Sets the value of the specified pixel including the alpha component. + The row. + The column. + The value to set. + \new494 Added in version 4.9.4 - + - The source type of the image. + Gets the index of the left most pixel of the original image that was included in the current buffer. - Images start with istUninitialized state. After loading bmp images istDiskBased or istInMemory value will be set depending - on the value of inMem parameter. For GDAL images istGDALBased will be set. - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - Retrieves the last error generated in the object. + Gets the index of the top most pixel of the original image that was included in the current buffer. + \new494 Added in version 4.9.4 - + - Gets or sets a boolean value which indicates how images with identical size and position on the map will be drawn. + Gets the active color scheme used for the rendering, it may be either default or custom one. - When set to true such images will be merged into a single bitmap. This may improve performance - in case of low number of data pixels (those which differ from the transparent color). The default value is false. - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - Returns file handle for BMP image. For inner use only. + Clears the overviews for the datasource. + \new494 Added in version 4.9.4 - + - Get or sets an instance of GeoProjection class associated with the image. + Sets the band minimum maximum values for the band. Values outside of this range will not be rendered. - The property can't be set to NULL (there is always an instance of GeoProjection class associated with image). - \new493 Added in version 4.9.3 + Index of the band. + The minimum. + The maximum. + True on success. + \new494 Added in version 4.9.4 - + - Returns true if image object is empty, i.e. not bound to some disk-based datasource and doesn't hold any in-memory data. - This property is the same as checking Image.SourceType = istUninitialized. + Calculates the minimum and maximum values for the specified band and caches them for further use. + Index of the band. + True on success. + \new494 Added in version 4.9.4 - + + - Returns the extents of the image. + Gets or sets the horizontal and vertical alignment of labels. - + - Gets the height of the image in pixels. + Restores the state of the object from the string. + A string generated by LabelCategory.Serialize() method. - + - Gets or sets the number of map units per image pixel for x axis. + Gets or sets the value which indicates whether the category will be used in the process of shapefile drawing. - The changes of this value will result in scaling of the image horizontally. - \new48 Added in version 4.8 - + - Gets or sets the number of map units per image pixel for y axis. + Gets or sets expression which defines shapes that belong to this category. - The changes of this value will result in scaling of the image vertically. - \new48 Added in version 4.8 - + - Gets the height of the image. + Gets or sets a boolean value which indicates whether font is bold. - This property should be used to return the total height of the image, as compared to the height of the image buffer. - The height of the image in pixels. - \new48 Added in version 4.8 - + - Gets the width of the image. + Gets or sets font color of labels. - This property should be used to return the total width of the image, as compared to the width of the image buffer. - The width of the image in pixels. - \new48 Added in version 4.8 - + - Gets or sets the x coordinate of the center of lower left pixel of the image in map units. + Gets or sets the second font color - \new48 Added in version 4.8 - + - Gets or sets the y coordinate of the center of lower left pixel of the image in map units. + Gets or sets the gradient for the font of labels. - \new48 Added in version 4.8 - + - Gets the width of the image in pixels. + Gets or sets a boolean value which indicates whether font is italic. - + - Gets or sets the x coordinate of the center of the lower-left pixel in the image. + Gets or sets font name to draw labels with. + The names of fonts or font families like "Arial" should be passed. - + - Gets or sets the y coordinate of the center of the lower-left pixel in the image. + Gets or sets the outline color of the font. + \see FontOutlineVisible - + - Gets or sets the number of map units per pixel of image buffer for x axis. + Gets or sets a boolean value which indicates whether outline of the font is visible. - The set part of the property is not applicable for GDAL images. + \see FontOutlineColor, FontOutlineWidth - + - Gets or sets the number of map units per pixel of image buffer for y axis. + Gets or sets the width in pixels of the font outline - The set part of the property is not applicable for GDAL images. + \see FontOutlineVisible - + - The interpolation mode for images which are displayed with the resolution higher than original, i.e. after zoom in (down). + Gets or sets the size of the font - + - Gets or sets the drawing method of image. + Gets or sets a boolean value which indicates whether font is striked out. - Was used temporarily while moving from GDI to GDI+ drawing. - \deprecated v 4.8. No longer used. - + - A boolean value which indicates whether an image will be displayed using a gray palette. + Gets or sets the transparency of the font. Values from 0 (opaque) to 255 (transparent) are accepted. - + - Gets or sets a color which is used as the transparency color for the image. + Gets or sets a boolean value which indicates whether the font is underlined. - + - Gets or sets a second color which is used as the transparency color for the image. + Gets or sets the back color of the frame. - All the colors between TransparencyColor and TransparencyColor2 will be transparent. - This "between" relation is calculated for each color channel and then the results are combined by AND operation. - + - Gets or sets the value which define alpha component of image colors (0.0-1.0). + Gets or sets the end color of the frame gradient. - The values range from 0.0(fully transparent) to 1.0(fully opaque). + \see FrameGradientMode - + - The interpolation mode for images which are displayed with the resolution lower than original, i.e. after zooming out (up). + Gets or sets the gradient mode for the label's frame. + Use gmNone value to disable gradient. - + - Gets or sets whether or not the transparency color is being used when the image is displayed. + Gets or set the outline color of the label's frame. - + - Gets or sets the picture object. + Gets or sets the outline color of the label's frame. - - + - Gets or sets the color scheme to render image with. + Gets or sets the width of the label's frame outline. - This property should be used for grid datasources in the first place (when there is no build-in colors). - But may also be used for a single band of regular RGB/ARGB images for synthetic colors and hillshading. - When no custom color scheme is set, grid rendering is chosen the color scheme from Image.ImageColorScheme will be used. - \new491 Added in version 4.9.1 - + - Gets the value which indicates whether an image object represents a visualization proxy for another datasource. + Gets or sets the horizontal distance from text to the border of label's frame - Will return true if the image was opened with Grid.OpenAsImage only. When opened directly the link to the source grid will be lost. - \new491 Added in version 4.9.1 - + - Returns true if the image is rendered as grid. + Gets or sets the vertical distance from text to the border of label's frame - \new491 Added in version 4.9.1 - + - Gets the name of the source grid in case the image represent a visualization proxy for a grid. + Gets or sets the transparency of the label's frame. Values from 0 to 255 are accepted. - \new490 Added in version 4.9.0 - + - Gets or sets index of band within datasource whose values should be used to apply color scheme. + Gets or sets the shape of the label's frame - Other bands will ignored during display process. This is useful for multiband grids (e.g. NetCDF), - but may also be used with RGB images, to set synthetic colors for a single band. - \new491 Added in version 4.9.1 + - + - Indicate whether hillshade algorithm will be used for generation of image representation of the grid. + Gets or sets a boolean value which indicates whether label's frame will be drawn. - The behaviour has changed in v4.9. Now when active it only switches ColoringType from Hillshade to Gradient. - In v.4.8. it used to have the same behaviour as Image.AllowExternalColorScheme. - + - Gets or sets the predefined color scheme for the image. Applicable for GDAL images only. + Gets or sets the color of the halo around the text of the label. - The color scheme is used for generation of image representation of the grid. - + - Gets grid color scheme this proxy image was generated with. The method should be called for proxy images only: Image.IsGridProxy = true. + Gets or sets the width of the halo around the text of the label. - Color scheme will be read from .mwleg XML file on the disk. - + - Gets the GDAL driver which manages the current datasource. + Gets or sets a boolean value which indicates whether a halo around text will be drawn. - \new494 Added in version 4.9.4 - + - Gets the active band (the one used for rendering when grid rendering is on). + Gets or sets the alignment of text within label's frame. - \new494 Added in version 4.9.4 + This property is commonly used for the alignment of multi-line labels. - + - Gets the palette interpretation for the image. + Gets or sets the orientation of the label relative to the polyline it belongs to. - \new494 Added in version 4.9.4 - + - Gets or sets the brightness of the image. + Gets or sets the maximum value for the specified label category in case an LabelCategory.Expression contains a range of values. - \new494 Added in version 4.9.4 + The property is used internally. - + - Gets or sets the contrast of the image. + Gets or sets the minimum value for the specified label category in case an LabelCategory.Expression contains a range of values. - \new494 Added in version 4.9.4 + The property is used internally. - + - Gets or sets the saturation of the image. + Gets or sets the name of the category. The names must not be unique. - \new494 Added in version 4.9.4 - + - Gets or sets the hue of the image. + Gets or sets the horizontal offset in pixels which is used to draw labels. - \new494 Added in version 4.9.4 + When labels are subject to the rotation, "horizontal" means "along text width". + \see Labels.AutoOffset property - + - Gets or sets the gamma correction value for the image. + Gets or sets the vertical offset in pixels which is used to draw labels. - \new494 Added in version 4.9.4 + When labels are subject to the rotation, "vertical" means "along text height". + \see Labels.AutoOffset property - + - Gets or sets the colorize intensity. + The property isn't implemented. - \new494 Added in version 4.9.4 - + - Gets or sets the color of the colorize. + Returns the state of the object in the XML-formatted string. - \new494 Added in version 4.9.4 + Use LabelCategory.Deserialize() to restore the state. + Serialized string - + - Gets or sets the index of the red band (used when RGB rendering is chosen). + Gets or sets a color of shadow for the text of the label. - \new494 Added in version 4.9.4 + \see ShadowVisible, ShadowOffsetX, ShadowOffsetY - + - Gets or sets the index of the green band (used when RGB rendering is chosen). + Gets or sets the horizontal distance between text of the label and its shadow. - \new494 Added in version 4.9.4 + When labels are subject to the rotation, "horizontal" means "along text width" + \see ShadowOffsetY, ShadowVisible - + - Gets or sets the index of the blue band (used when RGB rendering is chosen). + Gets or sets the horizontal distance between text of the label and its shadow. - \new494 Added in version 4.9.4 + When labels are subject to the rotation, "vertical" means "along text height" + \see ShadowOffsetX, ShadowVisible - + - Gets or sets a value indicating whether RGB band mapping will be used. + Gets or sets a boolean value which indicates whether shadow of the label will be visible. - \see RedBandIndex, GreenBandIndex, BlueBandIndex, AlphaBandIndex - \new494 Added in version 4.9.4 + \see ShadowColor, ShadowOffsetX, ShadowOffsetY - + - Gets or sets a value indicating whether the band - set by Image.ActiveBandIndex will be used rather then RGB rendering. + Gets or sets a boolean value which indicates whether shapes that belongs to the category + will be visible. - \new494 Added in version 4.9.4 - + - Gets or sets the index of the alpha band. + Gets or sets the maximum font size fo the category. \new494 Added in version 4.9.4 - + - Gets or sets a value indicating whether to use active band as an alpha band as well. + Represents a single label on the map. - \new494 Added in version 4.9.4 + \dot + digraph label_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + lb [ label="Label" URL="\ref Label"]; + + node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; + lbs [ label="Labels" URL="\ref Labels"]; + + edge [ dir = "none", arrowhead="open", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + lbs -> lb [ URL="\ref Labels.get_Label()", tooltip = "Labels.get_Label()", headlabel = " n"]; + } + \enddot + + Graph description\n\n + Multipart shapes can have separate labels for every part. Each of such labels is represented by the instance of Label class. + Labels added to the map can be accessed via Labels.get_Label() property. It's not recommended to store instances of this class + retrieved from the map after the layer they belong to was removed.\n\n + This code demonstrate how to move the label for a shape with a given index. + \code + Shapefile sf = some_shapefile; + int shapeIndex = 10; // the index of shape we want to move + + // retrieving label object + Label label = sf.Labels.get_Label(shapeIndex, 0); // 0 - the first part + if (label != null) + { + // is it currently displayed on the screen? + Debug.Print("The label is drawn: " + label.IsDrawn.ToString()); + + label.x += 10.0; // let's move it to the right by 10 map units + label.y -= 5.0; // let's move it to the bottom by 5 map units + label.Visible = true; // ensure that it's visible + + Debug.Print("The text of the label: " + label.Text); + map.Redraw(); // redraw is needed to see the changes of position + } + else { + Debug.Print(string.Format("The chart with index {0} doesn't exists", shapeIndex)); + } + \endcode + \new48 Added in version 4.8 - + - Gets or sets a value indicating whether colors should be reversed during gray scale rendering (i.e. the smallest values are white). + The index of visualization category the label belongs to. - \new494 Added in version 4.9.4 + The value -1 indicates that the label doesn't belong to any visualization category and + default drawing options specified in the Labels class will be used for it's drawing. - + - Gets or sets a value indicating whether built-in color table of the image will be ignored. + Gets a boolean value which indicates whether the label was drawn at the current extents of the map. - \new494 Added in version 4.9.4 - + - Gets the current rendering mode for the image (depends on the values of other properties). + Gets or sets the angle of label rotation in degrees. Positive values set + clockwise rotation, negative - counter-clockwise. - \new494 Added in version 4.9.4 - + - Gets the index of the left most pixel of the original image that was included in the current buffer. + Gets the extents the label occupies on the map (in pixels). - \new494 Added in version 4.9.4 + In case the label wasn't drawn on the map, NULL reference will be returned. - + - Gets the index of the top most pixel of the original image that was included in the current buffer. + Gets or sets the text of the label. - \new494 Added in version 4.9.4 - + - Gets the active color scheme used for the rendering, it may be either default or custom one. + Gets or sets a boolean value which indicates whether the label is visible. - \new494 Added in version 4.9.4 + Call AxMap.Redraw() to see the effect of this property. - - + - Restores the state of the object from the string. + Gets or sets the horizontal position of the label in map coordinates. - A string generated by LabelCategory.Serialize() method. - + - Returns the state of the object in the XML-formatted string. + Gets or sets the vertical position of the label in map coordinates. - Use LabelCategory.Deserialize() to restore the state. - Serialized string - + - Gets or sets the horizontal and vertical alignment of labels. + Represents a list of labels of the map layer and their visualization options. + \dot + digraph labels_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + lcat [ label="LabelCategory" URL="\ref LabelCategory"]; + lb [ label="Label" URL="\ref Label"]; + + node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; + lbs [ label="Labels" URL="\ref Labels"]; + + node [style = dashed, color = gray]; + sf [ label="Shapefile" URL="\ref Shapefile"]; + img [ label="Image" URL="\ref Image"]; + + edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + sf -> lbs [ URL="\ref Shapefile.Labels", tooltip = "Shapefile.Labels", headlabel = " 1"]; + img -> lbs [ URL="\ref Image.Labels", tooltip = "Image.Labels", headlabel = " 1"]; + lbs -> lcat [ URL="\ref Labels.get_Category()", tooltip = "Labels.get_Category()", headlabel = " n"]; + lbs -> lb [ URL="\ref Labels.get_Label()", tooltip = "Labels.get_Label()", headlabel = " n"]; + } + \enddot + + Graph description\n\n + Here is a diagram with groups of API members of Labels class. + \dotfile labelsgroups.dot + Graph description + \new48 Added in version 4.8 - + - Gets or sets the value which indicates whether the category will be used in the process of shapefile drawing. + Gets or sets the global callback object which is used for passing to the client + an information about progress and errors. + An instance of the class which implements ICallback interface should be passed. + The class should be implemented by caller. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Gets or sets expression which defines shapes that belong to this category. + A text string associated with the instance of the class. Any value can be stored by developer in this property. - + - Gets or sets a boolean value which indicates whether font is bold. + Marks that values of size field have changed and the size of labels should be recalculated on the next redraw. + \new494 Added in version 4.9.4 - + - Gets or sets font color of labels. + Gets or sets the maximum font size for labels (when size field is used). + \new494 Added in version 4.9.4 - + - Gets or sets the second font color + Gets or sets a value indicating whether variable size for labels should be used + (in the range between Labels.FontSize, Labels.FontSize2). + \new494 Added in version 4.9.4 - + - Gets or sets the gradient for the font of labels. + Gets or sets a value indicating whether logarithmic scale will be used to calculate the size of labels. + \see Labels.UseVariableSize + \new494 Added in version 4.9.4 - + - Gets or sets a boolean value which indicates whether font is italic. + Returns the code of the last error which has occurred within the instance of class. - + - Gets or sets font name to draw labels with. + Gets the description of the specific error code. - The names of fonts or font families like "Arial" should be passed. + The error code returned by Labels.LastErrorCode. + The string with the description. - + - Gets or sets the outline color of the font. + Gets or sets the list of visualization options of labels. For inner use only. - \see FontOutlineVisible - + - Gets or sets a boolean value which indicates whether outline of the font is visible. + Gets or sets the values indicating whether GDI+ library should be used to draw labels. - \see FontOutlineColor, FontOutlineWidth + The default value is true. When set to false, GDI will be used for drawing. + In GDI mode no gradients and transparency is supported, while in some cases it can be somewhat faster then GDI+. - + - Gets or sets the width in pixels of the font outline + Gets a classification field used by unique values classification. - \see FontOutlineVisible + The property is used internally in couple with LabelCategory.MinValue and LabelCategory.MaxValue + to avoid the parsing of expressions for the categories in case unique values classification was applied. - + - Gets or sets the size of the font + Gets or sets the expression used to generate text of labels from the attribute table of the shapefile. + Applicable for the instances of Labels class associated with shapefile (obtained by Shapefile.Labels). - + - Gets or sets a boolean value which indicates whether font is striked out. + For labels attached to shapefile layer updates the text of each label based on Expression property. + The method is necessary when the values in underlying DBF table have changed, + since Labels class doesn't track these changes automatically. - + + + - Gets or sets the transparency of the font. Values from 0 (opaque) to 255 (transparent) are accepted. + Removes a visualization category with specified index. + The index of category to be removed. + True on successful removal and false otherwise. - + - Gets or sets a boolean value which indicates whether the font is underlined. + Adds a visualization category for labels. + Use LabelCategory.Expression or Label.Category to map specific labels to the newly + created category. + The name of the new category + The reference to the new category. - + - Gets or sets the back color of the frame. + Maps labels to the visualization categories. + LabelCategory.Expression property is analysed. + Afterwards Label.Category property is changed for all labels whose attributes comply with the expression. - + - Gets or sets the end color of the frame gradient. + Removes all the visualization categories. - \see FrameGradientMode - + - Gets or sets the gradient mode for the label's frame. + Generates visualization categories for labels based on certain field from the attribute + table of the parent shapefile. - Use gmNone value to disable gradient. + Use Labels.ApplyCategories to map particular labels to the generated categories based on the + LabelCategory.Expression property. + The index of field from the attribute table. + The type of classification. + Number of categories to be generated. It will be ignored for ctUniqueValues. + True on successful generation and false otherwise. - + - Gets or set the outline color of the label's frame. + Inserts a new visualization category at the given position of the list. + The index to insert the new category at. Should be greater or equal to 0 and less then + Labels.numCategories. + The name of the new category. + The reference to the newly created category. - + - Gets or sets the outline color of the label's frame. + Moves a specified label category down in the list. + The index of the category to move. + True on successful operation and false otherwise. - + - Gets or sets the width of the label's frame outline. + Moves a specified label category up in the list. + The index of the category to move. + True on successful operation and false otherwise. - + - Gets or sets the horizontal distance from text to the border of label's frame + Number of visualization categories associated with this instance of class. - + - Gets or sets the vertical distance from text to the border of label's frame + Applies color scheme to the visualization categories. + The method of interpolation. + Color scheme to take colors from. - + - Gets or sets the transparency of the label's frame. Values from 0 to 255 are accepted. + Applies color scheme to the visualization categories. + Allows to choose the part of label to apply colors to. + The method of interpolation. + Color scheme object to borrow colors from. + The element of the label to apply colors to. Labels.ApplyColorScheme is shortcut for using leDefault option. - + - Gets or sets the shape of the label's frame + Applies color scheme to the visualization categories. - + The method of interpolation. + Color scheme object to borrow colors from. + The element of the label to apply colors to. Labels.ApplyColorScheme is shortcut for using leDefault option. + The index of the first visualization category to apply colors to. + The index of the last visualization category to apply colors to. - + + \addtogroup labels_management Labels generation + Here is a list of properties and methods for adding labels (or their parts) to the map or removing them. + This module is a part of the documentation of Labels class. + \dot + digraph labels_management_graph { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Labels" URL="\ref Labels"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Managemant" URL="\ref labels_management"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ - Gets or sets a boolean value which indicates whether label's frame will be drawn. + Adds a new label as the last one in the list. + All the parameters passed to the method can be changed afterwards using Labels.get_Label() property. + The text of the new label. + The x coordinate of the new label. + The y coordinate of the new label. + The rotation of the label in degrees. Positive values set clockwise rotation, negative - counter-clockwise. + The index of visualization category to be used for the label drawing. + Default value is -1, which means the default drawing options will be used. - + - Gets or sets the color of the halo around the text of the label. + Adds a part to the label with specified index. + According to the shapefile specification shapes such as polylines or polygons can have multiple parts. + Use this method to add a separate label for each part of the parent shape. + The index of label to add a part to. + The text to be displayed. + The x coordinate of the part. + The y coordinate of the part. + The rotation of the label's part. + The index of visualization category to be used for the label drawing. + Default value is -1, which means the default drawing options will be used. - + - Gets or sets the width of the halo around the text of the label. + Removes all the labels and parts but not the visualization categories. - + - Gets or sets a boolean value which indicates whether a halo around text will be drawn. + Gets the number of labels. + Each label can have more then one part. - + - Gets or sets the alignment of text within label's frame. + Generates labels for each shape of the parent shapefile. - This property is commonly used for the alignment of multi-line labels. + Applicable for the instances of Labels class associated with shapefile, i.e. returned + by Shapefile.Labels property. + The expression to be used for generation of the text for labels. + The method to calculate position of each label. + A value which indicates whether labels should be created for each part of the + multipart shape or for the largest part only. + The number of generated labels. - + - Gets or sets the orientation of the label relative to the polyline it belongs to. + Inserts a new label at the given position. + The index to insert the label at. + The text of the label. + The x coordinate of the label. + The y coordinate of the label. + The angle of label rotation. + The index of the visualization category for the label. Use -1 if the label doesn't belong to any category. + True on success and false otherwise. - + - Gets or sets the maximum value for the specified label category in case an LabelCategory.Expression contains a range of values. + Inserts a new part for the specified label. - The property is used internally. + %Labels can have several parts which correspond to the parts of shapes they belong to. + The index of the label. + The index to insert the new part at. + The text of the label. + The x coordinate of the label. + The y coordinate of the label. + The rotation of the label in degrees. + The index of visualization category. Use -1 if the label doesn't belong to any category. + True on success or false otherwise. - + - Gets or sets the minimum value for the specified label category in case an LabelCategory.Expression contains a range of values. + Removes a label with the specified index. If the label is multipart then all its parts will be removed. - The property is used internally. + The index of the label to be removed. + True on success and false otherwise. - + - Gets or sets the name of the category. The names must not be unique. + Removes a part of label with the specified index. + The index of the label. + The index of part to be removed. + True on success and false otherwise. - + - Gets or sets the horizontal offset in pixels which is used to draw labels. + Gets or sets a boolean value which indicates whether labels should be synchronized with the parent shapefile. - When labels are subject to the rotation, "horizontal" means "along text width". - \see Labels.AutoOffset property + Synchronization means that labels will be automatically added or removed simultaneously with + the corresponding operation in the shapefile. + Labels can be synchronized only if their number is equal to the number of shapes. + + \see Labels.Count, Shapefile.NumShapes - + - Gets or sets the vertical offset in pixels which is used to draw labels. + Gets label with the specified index. - When labels are subject to the rotation, "vertical" means "along text height". - \see Labels.AutoOffset property + The index of label to return. + The part of the label to return. In case of single part labels 0 should be used. + A reference to the label or null reference in case of incorrect index. - + - The property isn't implemented. + Gets the number of parts for the label with specified index. + The index of the label. + The number of parts or -1 in case of incorrect index - + + \addtogroup labels_positioning Labels positioning + Here is a list of properties and methods which affects alignment, positioning and scale of labels. This module is a part of the documentation of Labels class. + \dot + digraph labels_positioning { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Labels" URL="\ref Labels"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Positioning" URL="\ref labels_positioning"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ - Gets or sets a color of shadow for the text of the label. + Map scale for which the size of labels will be equal to value set in Labels.FontSize property. - \see ShadowVisible, ShadowOffsetX, ShadowOffsetY + Applicable only when Label.Scale is set to true. - + - Gets or sets the horizontal distance between text of the label and its shadow. + Gets or sets the value which indicates whether the labels will change their size depending upon map scale. The default value is false. - When labels are subject to the rotation, "horizontal" means "along text width" - \see ShadowOffsetY, ShadowVisible + \see Labels.BasicScale - + - Gets or sets the horizontal distance between text of the label and its shadow. + Gets or sets the value which affects the sequence of labels drawing relative to the map layers. - When labels are subject to the rotation, "vertical" means "along text height" - \see ShadowOffsetX, ShadowVisible + See details in the description of tkVerticalPosition enumeration. - + - Gets or sets a boolean value which indicates whether shadow of the label will be visible. + Returns the indices of all labels which are displayed in the given part of the map. - \see ShadowColor, ShadowOffsetX, ShadowOffsetY - - - - Gets or sets a boolean value which indicates whether shapes that belongs to the category - will be visible. + This property doesn't change appearance of the labels. + The bounding box in screen coordinates. + The selection tolerance. + The selection mode. + An output array with indices of the labels. + An output array with indices of parts for each label. + True in case at least one label fell into selection. + + + + Gets or sets the method of label positioning. - + - Gets or sets the maximum font size fo the category. + Gets or sets the type of the label's orientation relative to the direction of the labelled shape. - \new494 Added in version 4.9.4 + Applicable for the instance of the Labels class associated with polyline shapefiles, + i.e. obtained by Shapefile.Labels property while Shapefile.ShapefileType is polyline. - + - Represents a single label on the map. + Gets or sets the horizontal offset in pixels which is used to draw labels. + + When labels are subject to the rotation, "horizontal" means "along the text width". + \see Labels.AutoOffset property + + + + Gets or sets the vertical offset in pixels which is used to draw labels. + + When labels are subject to rotation "vertical" means "along the text height". + \see Labels.AutoOffset property + + + + Gets or sets the value which defines an alignment of text within label's frame. + + Should be used with multiline labels. + + + + Turns on or off the auto offset behaviour. + + + When set to true, Labels.OffsetX and Labels.OffsetY property will be changed + automatically according to the size of symbols for parent shape points to avoid overlaps. + Applicable for point and multipoint shapefiles only. + + + + + Sets horizontal and vertical alignment of labels. + + + \addtogroup labels_serialization Labels serialization + Here is a list of methods and properties for serialization of labels and their persistence between the runs of application. + This module is a part of the documentation of Labels class. \dot - digraph label_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - lb [ label="Label" URL="\ref Label"]; - - node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; - lbs [ label="Labels" URL="\ref Labels"]; - - edge [ dir = "none", arrowhead="open", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - lbs -> lb [ URL="\ref Labels.get_Label()", tooltip = "Labels.get_Label()", headlabel = " n"]; + digraph labels_serialization { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Labels" URL="\ref Labels"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Serialization" URL="\ref labels_serialization"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; } \enddot - Graph description\n\n - Multipart shapes can have separate labels for every part. Each of such labels is represented by the instance of Label class. - Labels added to the map can be accessed via Labels.get_Label() property. It's not recommended to store instances of this class - retrieved from the map after the layer they belong to was removed.\n\n - This code demonstrate how to move the label for a shape with a given index. - \code - Shapefile sf = some_shapefile; - int shapeIndex = 10; // the index of shape we want to move - - // retrieving label object - Label label = sf.Labels.get_Label(shapeIndex, 0); // 0 - the first part - if (label != null) - { - // is it currently displayed on the screen? - Debug.Print("The label is drawn: " + label.IsDrawn.ToString()); - - label.x += 10.0; // let's move it to the right by 10 map units - label.y -= 5.0; // let's move it to the bottom by 5 map units - label.Visible = true; // ensure that it's visible - - Debug.Print("The text of the label: " + label.Text); - map.Redraw(); // redraw is needed to see the changes of position - } - else { - Debug.Print(string.Format("The chart with index {0} doesn't exists", shapeIndex)); - } - \endcode - \new48 Added in version 4.8 - - + It's possible to serialize different types of information for labels (charts):\n + -# The drawing settings, such visualization options, order of drawing, etc. It's desirable to save them in virtually any scenario.\n\n + -# The positions of the labels (charts). It makes sense to save them to avoid the recalculation of the positions on the next loading. + It's quite relevant even for middle sized datasets if the more or less complex routine for positioning is used + (Shape.Centroid, Shape.InteriorPoint).\n\n + -# The angles rotation, text and categories for labels. This type of information requires serialization less often. The text of labels + can be easily restored by applying Labels.Expression. Unless the Label.Text property was set manually. + In the same way categories rely on LabelCategory.Expression and will be serialized among the first group of settings, + unless Label.Category property was set manually. Finally the rotation of labels which is preserved less often. + . + The first group of settings is embedded in the larger XML body, either layer or map settings. It can be saved: + - to the file (see AxMap.SaveLayerOptions, AxMap.SaveMapState); + - returned as a string (see AxMap.SerializeLayer, AxMap.SerializeMapState). + . + For data described in the 2nd and 3rd sections more options are available by Labels.SavingMode property and tkSavingMode enumeration. It can be: + - not serialized at all (modeNone); + - embedded in the layer or map settings in the same way as the first group (modeStandard); + - written to stand-alone XML file with the name [LayerName].lbl (modeXML, modeXMLOverwrite); + - written to the dbf table of the shapefile (modeDBF). + . + @{ - The index of visualization category the label belongs to. + Saves position and text of the labels to the attribute table (dbf file). - The value -1 indicates that the label doesn't belong to any visualization category and - default drawing options specified in the Labels class will be used for it's drawing. + A value which indicates whether the text of labels will be saved. + A value which indicates whether the mapping between labels + and visualization categories will be saved. + True on success and false otherwise. - + - Gets a boolean value which indicates whether the label was drawn at the current extents of the map. + Saves positions and text of the labels to the attribute table (dbf file). + This method allows to specify the names of fields to save the data in. + The name of field to store x coordinate. + The name of field to store y coordinate. + The name of field to store angle. + The name of field to store text. + The name of field to store category. + A value which indicates whether the text of labels will be saved. + A value which indicates whether the mapping between labels and visualization categories will be saved. + True on success and false otherwise. - + - Gets or sets the angle of label rotation in degrees. Positive values set - clockwise rotation, negative - counter-clockwise. + Saves the text, positions and visualization options of the labels to the XML file. + The name of the file to save the settings to. + True on successful saving and false otherwise. + Use Labels.get_ErrorMsg() to find out the reason of failure. - + - Gets the extents the label occupies on the map (in pixels). + Gets or sets the method to save and restore the state labels. - In case the label wasn't drawn on the map, NULL reference will be returned. + See details in tkSavingMode enumeration. - + - Gets or sets the text of the label. + Loads text and position of labels from the attribute table of the parent shapefile. + Applicable for the instance of the Labels class associated with polyline shapefiles, + i.e. obtained by Shapefile.Labels property + A value which indicates whether the text of the labels should be loaded. + A value which indicates whether the mapping between labels and visualization categories should be restored. + True on successful loading and false otherwise. - + - Gets or sets a boolean value which indicates whether the label is visible. + Loads text and position of labels from the attribute table of the parent shapefile. - Call AxMap.Redraw() to see the effect of this property. + The name of field which holds x values. + The name of field which holds y values. + The name of field which holds rotation angles. + The name of the field which stores text of the labels. + The name of the field which stores index of visualization category for each label. + A value which indicates whether the text of the labels should be loaded. + A value which indicates whether the mapping between labels and visualization categories should be restored. + True on successful loading and false otherwise. - + - Gets or sets the horizontal position of the label in map coordinates. + Restores the state of the labels from the specified XML file. + The name of the file previously generated by Labels.SaveToXML method. + True on successful loading and false otherwise. - + - Gets or sets the vertical position of the label in map coordinates. + Saves the state of the labels. + Serialized state holds information about visualization options, categories and text expressions. \n\n + Optionally it can hold information about position and text of labels (see Labels.SavingMode property). + The default values of the properties will not be serialized. + A string with serialized state. On failure an empty string will be returned. - + - Represents a list of labels of the map layer and their visualization options. + Restores the state of the Labels class from the string. + A string with serialized state generated by Labels.Serialize() method. + + + \addtogroup labels_visibility Labels visibility + Here is list of properties and methods which affect visibility of labels. This module is a part of the documentation of Labels class. \dot - digraph labels_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - lcat [ label="LabelCategory" URL="\ref LabelCategory"]; - lb [ label="Label" URL="\ref Label"]; - - node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; - lbs [ label="Labels" URL="\ref Labels"]; - - node [style = dashed, color = gray]; - sf [ label="Shapefile" URL="\ref Shapefile"]; - img [ label="Image" URL="\ref Image"]; - - edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - sf -> lbs [ URL="\ref Shapefile.Labels", tooltip = "Shapefile.Labels", headlabel = " 1"]; - img -> lbs [ URL="\ref Image.Labels", tooltip = "Image.Labels", headlabel = " 1"]; - lbs -> lcat [ URL="\ref Labels.get_Category()", tooltip = "Labels.get_Category()", headlabel = " n"]; - lbs -> lb [ URL="\ref Labels.get_Label()", tooltip = "Labels.get_Label()", headlabel = " n"]; + digraph labels_visibility { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Labels" URL="\ref Labels"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Visibility" URL="\ref labels_visibility"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; } \enddot - - Graph description\n\n - Here is a diagram with groups of API members of Labels class. - \dotfile labelsgroups.dot Graph description - \new48 Added in version 4.8 - - + @{ - Marks that values of size field have changed and the size of labels should be recalculated on the next redraw. + Gets or sets the value which indicates whether the labels will be visible on the map. - \new494 Added in version 4.9.4 - + - Gets the description of the specific error code. + Gets or sets an expression which defines what shapes should be labelled on the map. - The error code returned by Labels.LastErrorCode. - The string with the description. + Applicable only to the instances of the Labels class associated with shapefile, i.e. + obtained by Shapefile.Labels property. + \code + Labels lb = new Labels(); + lb.VisibilityExpression = "[Area] > 100 and [population] > 100000"; + \endcode - + - For labels attached to shapefile layer updates the text of each label based on Expression property. + Is not implemented. - The method is necessary when the values in underlying DBF table have changed, - since Labels class doesn't track these changes automatically. - + - Gets the visualization category (LabelCategory) with the specified index. + Gets or sets the value which indicates whether labels with the same text should be drawn. - The index of the category to get. - The reference to the category or null in case of the incorrect index. + When set to true only the labels with unique text will be drawn on map. The choice of label + to draw depends on their position in the list and the fact of belonging to the visualization category. - - + - Removes a visualization category with specified index. + Gets or sets the maximum scale at which labels are visible on the map. - The index of category to be removed. - True on successful removal and false otherwise. + \see Labels.DynamicVisibility, AxMap.CurrentScale - + - Adds a visualization category for labels. + Gets or sets the minimum size of the shape in pixels to be labelled at the current map scale. - Use LabelCategory.Expression or Label.Category to map specific labels to the newly - created category. - The name of the new category - The reference to the new category. - + - Maps labels to the visualization categories. + Get or sets the minimum scale at which labels are visible on the map. - LabelCategory.Expression property is analysed. - Afterwards Label.Category property is changed for all labels whose attributes comply with the expression. + \see Labels.DynamicVisibility, AxMap.CurrentScale - + - Removes all the visualization categories. + Gets or sets the minimum zoom at which labels are visible on the map. - + - Generates visualization categories for labels based on certain field from the attribute - table of the parent shapefile. + Gets or sets the maximum zoom at which labels are visible on the map. - Use Labels.ApplyCategories to map particular labels to the generated categories based on the - LabelCategory.Expression property. - The index of field from the attribute table. - The type of classification. - Number of categories to be generated. It will be ignored for ctUniqueValues. - True on successful generation and false otherwise. - + - Inserts a new visualization category at the given position of the list. + Gets or sets the value which affects the collision avoidance routine. + Two labels are considered overlapping when the distance between their bounding rectangles + is less then this value. - The index to insert the new category at. Should be greater or equal to 0 and less then - Labels.numCategories. - The name of the new category. - The reference to the newly created category. + \see Labels.AvoidCollisions - + - Moves a specified label category down in the list. + Gets or sets the value which turns the dynamic visibility on or off. - The index of the category to move. - True on successful operation and false otherwise. + + When set to true, labels will be visible only in the range of scales set by Labels.MinVisibleScale and Labels.MinVisibleScale. + - + - Moves a specified label category up in the list. + Gets or sets the value which indicates whether a routine for preventing of label overlaps will be used. - The index of the category to move. - True on successful operation and false otherwise. + When set to true overlapping labels won't be drawn. - + + \addtogroup labels_visualization Labels visualization + Here is the list of visualization properties for labels. This module is a part of the documentation of Labels class.\n\n + The more details on the topic in the description of the LabelCategory class. The properties listed below are used for all labels + without specific visualization category set, i.e. Label.Category == -1; + \dot + digraph labels_visualization { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Labels" URL="\ref Labels"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Visualization" URL="\ref labels_visualization"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ - Applies color scheme to the visualization categories. + Gets or sets the color of the label's shadow. - The method of interpolation. - Color scheme to take colors from. + \see ShadowVisible - + - Applies color scheme to the visualization categories. + Gets or sets the horizontal offset of the label's shadow. - Allows to choose the part of label to apply colors to. - The method of interpolation. - Color scheme object to borrow colors from. - The element of the label to apply colors to. Labels.ApplyColorScheme is shortcut for using leDefault option. + \see ShadowVisible - + - Applies color scheme to the visualization categories. + Gets or sets the vertical offset of the label's shadow. - The method of interpolation. - Color scheme object to borrow colors from. - The element of the label to apply colors to. Labels.ApplyColorScheme is shortcut for using leDefault option. - The index of the first visualization category to apply colors to. - The index of the last visualization category to apply colors to. + \see ShadowVisible - + - Adds a new label as the last one in the list. + Gets or sets the value which indicates whether label's shadow is visible. - All the parameters passed to the method can be changed afterwards using Labels.get_Label() property. - The text of the new label. - The x coordinate of the new label. - The y coordinate of the new label. - The rotation of the label in degrees. Positive values set clockwise rotation, negative - counter-clockwise. - The index of visualization category to be used for the label drawing. - Default value is -1, which means the default drawing options will be used. - + - Adds a part to the label with specified index. + Gets or sets the color of the halo around label's text. - According to the shapefile specification shapes such as polylines or polygons can have multiple parts. - Use this method to add a separate label for each part of the parent shape. - The index of label to add a part to. - The text to be displayed. - The x coordinate of the part. - The y coordinate of the part. - The rotation of the label's part. - The index of visualization category to be used for the label drawing. - Default value is -1, which means the default drawing options will be used. + \see Labels.HaloVisible - + - Removes all the labels and parts but not the visualization categories. + Gets or sets the size of the halo drawn around label's text. + \see Labels.HaloVisible - + - Generates labels for each shape of the parent shapefile. + Gets or sets the value which indicates whether label's halo is visible. - Applicable for the instances of Labels class associated with shapefile, i.e. returned - by Shapefile.Labels property. - The expression to be used for generation of the text for labels. - The method to calculate position of each label. - A value which indicates whether labels should be created for each part of the - multipart shape or for the largest part only. - The number of generated labels. - + - Inserts a new label at the given position. + Gets or sets the value which indicates whether the font of labels is bold. - The index to insert the label at. - The text of the label. - The x coordinate of the label. - The y coordinate of the label. - The angle of label rotation. - The index of the visualization category for the label. Use -1 if the label doesn't belong to any category. - True on success and false otherwise. - + - Inserts a new part for the specified label. + Gets or sets the color of the label font. - %Labels can have several parts which correspond to the parts of shapes they belong to. - The index of the label. - The index to insert the new part at. - The text of the label. - The x coordinate of the label. - The y coordinate of the label. - The rotation of the label in degrees. - The index of visualization category. Use -1 if the label doesn't belong to any category. - True on success or false otherwise. - + - Removes a label with the specified index. If the label is multipart then all its parts will be removed. + Gets or sets the second color of the label font. It is used to set color gradient for the font. - The index of the label to be removed. - True on success and false otherwise. + \see Labels.FontGradientMode - + - Removes a part of label with the specified index. + Gets or sets the gradient mode for the labels. - The index of the label. - The index of part to be removed. - True on success and false otherwise. + \see Labels.FontColor2 - + - Gets label with the specified index. + Gets or sets the value which indicates whether the font of labels is italic. - The index of label to return. - The part of the label to return. In case of single part labels 0 should be used. - A reference to the label or null reference in case of incorrect index. - + - Gets the number of parts for the label with specified index. + Gets or sets the name of the font to draw labels with, e.g. Arial. - The index of the label. - The number of parts or -1 in case of incorrect index - + - Returns the indices of all labels which are displayed in the given part of the map. + Sets the color of the font outline. - This property doesn't change appearance of the labels. - The bounding box in screen coordinates. - The selection tolerance. - The selection mode. - An output array with indices of the labels. - An output array with indices of parts for each label. - True in case at least one label fell into selection. + \see Labels.FontOutlineVisible - + - Saves position and text of the labels to the attribute table (dbf file). + Gets or sets the value which indicates whether font outline is visible. The default value is false. - A value which indicates whether the text of labels will be saved. - A value which indicates whether the mapping between labels - and visualization categories will be saved. - True on success and false otherwise. - + - Saves positions and text of the labels to the attribute table (dbf file). + Gets or sets the width of the font outline. The default value is 1. - This method allows to specify the names of fields to save the data in. - The name of field to store x coordinate. - The name of field to store y coordinate. - The name of field to store angle. - The name of field to store text. - The name of field to store category. - A value which indicates whether the text of labels will be saved. - A value which indicates whether the mapping between labels and visualization categories will be saved. - True on success and false otherwise. + \see FontOutlineVisible - + - Saves the text, positions and visualization options of the labels to the XML file. + Gets or sets the size of the font to draw labels with. - The name of the file to save the settings to. - True on successful saving and false otherwise. - Use Labels.get_ErrorMsg() to find out the reason of failure. - + - Loads text and position of labels from the attribute table of the parent shapefile. + Gets or sets the value which indicates whether the font of labels is struck out. - Applicable for the instance of the Labels class associated with polyline shapefiles, - i.e. obtained by Shapefile.Labels property - A value which indicates whether the text of the labels should be loaded. - A value which indicates whether the mapping between labels and visualization categories should be restored. - True on successful loading and false otherwise. - + - Loads text and position of labels from the attribute table of the parent shapefile. + Gets or sets the transparency of the font. A values between 0 (transparent) to 255 (opaque) can be used. - The name of field which holds x values. - The name of field which holds y values. - The name of field which holds rotation angles. - The name of the field which stores text of the labels. - The name of the field which stores index of visualization category for each label. - A value which indicates whether the text of the labels should be loaded. - A value which indicates whether the mapping between labels and visualization categories should be restored. - True on successful loading and false otherwise. + The default value is 255. Values which fall outside the specified range will be + corrected to the closest acceptable value without reporting an error. - + - Restores the state of the labels from the specified XML file. + Gets or sets the value which indicates whether the font of labels is struck out. - The name of the file previously generated by Labels.SaveToXML method. - True on successful loading and false otherwise. - + - Saves the state of the labels. + Gets or sets the color of the frame's background. - Serialized state holds information about visualization options, categories and text expressions. \n\n - Optionally it can hold information about position and text of labels (see Labels.SavingMode property). - The default values of the properties will not be serialized. - A string with serialized state. On failure an empty string will be returned. + - + - Restores the state of the Labels class from the string. + Gets or sets the second color of the frame's background. - A string with serialized state generated by Labels.Serialize() method. + , Labels.FrameGradientMode - + - Gets or sets the global callback object which is used for passing to the client - an information about progress and errors. - - An instance of the class which implements ICallback interface should be passed. - The class should be implemented by caller. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - A text string associated with the instance of the class. Any value can be stored by developer in this property. + Gets or sets the type of gradient for the frame of the label. + + For all values other than gmNone a gradient + starting from Labels.FrameBackColor and ending by Labels.FrameBackColor2 will be applied. + - + - Gets or sets the maximum font size for labels (when size field is used). + Gets or sets the outline color of the label's frame - \new494 Added in version 4.9.4 + - + - Gets or sets a value indicating whether variable size for labels should be used - (in the range between Labels.FontSize, Labels.FontSize2). + Gets or sets the outline style of the label's frame. - \new494 Added in version 4.9.4 + - + - Gets or sets a value indicating whether logarithmic scale will be used to calculate the size of labels. + Gets or sets the width of the outline of the label's frame. - \see Labels.UseVariableSize - \new494 Added in version 4.9.4 + - + - Returns the code of the last error which has occurred within the instance of class. + Gets or sets the horizontal distance between the text of the label and its frame. - + - Gets or sets the list of visualization options of labels. For inner use only. + Gets or sets the vertical distance between the text of the label and its frame. - + - Gets or sets the values indicating whether GDI+ library should be used to draw labels. + Gets or sets the transparency of the label's frame. A values between 0 (transparent) to 255 (opaque) can be used. - The default value is true. When set to false, GDI will be used for drawing. - In GDI mode no gradients and transparency is supported, while in some cases it can be somewhat faster then GDI+. + The default value is 255. Values which fall outside the specified range will be + corrected to the closest acceptable value without reporting an error. - + - Gets a classification field used by unique values classification. + Gets or sets the shape of the label's frame. - The property is used internally in couple with LabelCategory.MinValue and LabelCategory.MaxValue - to avoid the parsing of expressions for the categories in case unique values classification was applied. - + - Gets or sets the expression used to generate text of labels from the attribute table of the shapefile. + Gets or sets the values which indicates whether label's frame is visible. - Applicable for the instances of Labels class associated with shapefile (obtained by Shapefile.Labels). - + - Number of visualization categories associated with this instance of class. + Gets or sets rendering hint to be used during GDI+ rendering. + This property will be ignored if GlobalSettings.AutoChooseRenderingHintForLabels is set to true. - + - Gets the number of labels. + Gets or sets the formatting to be used for floating point numbers during generation of labels. - Each label can have more then one part. + See acceptable formats in description of C printf function. + The commonly used values may be: %g (shortest representation), %.2f (two decimal points). + \new493 Added in version 4.9.3 - + - Gets or sets a boolean value which indicates whether labels should be synchronized with the parent shapefile. + Provides means for defining custom pattern from lines and point symbols for rendering polyline layers. - Synchronization means that labels will be automatically added or removed simultaneously with - the corresponding operation in the shapefile. - Labels can be synchronized only if their number is equal to the number of shapes. - - \see Labels.Count, Shapefile.NumShapes + The line pattern consists of line segments which can be representing by lines of various style, + width and color or by markers. Line segments are drawn one atop of the other in the sequence defined + in the line pattern. \n\n + Here is a diagram for the LinePattern class. + \dot + digraph pattern_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + segm [ label="LineSegment" URL="\ref LineSegment"]; + + node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; + ptrn [label="LinePattern" URL="\ref LinePattern"]; + + node [style = dashed, color = gray]; + sdo [ label="ShapeDrawingOptions" URL="\ref ShapeDrawingOptions"]; + + edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + sdo -> ptrn [ URL="\ref ShapeDrawingOptions.LinePattern", tooltip = "ShapeDrawingOptions.LinePattern", headlabel = " 1"]; + ptrn -> segm [ URL="\ref LinePattern.get_Line()", tooltip = "LinePattern.get_Line()", headlabel = " n"]; + } + \enddot + Graph description + \new48 Added in version 4.8 - + - Map scale for which the size of labels will be equal to value set in Labels.FontSize property. + Adds a line segment to the pattern. - Applicable only when Label.Scale is set to true. + The color of the line. + The width of the line. + The style of the line. - + - Gets or sets the value which indicates whether the labels will change their size depending upon map scale. The default value is false. + Adds a segment represented by point symbol (marker). - \see Labels.BasicScale + The type of the marker. + Reference to the newly added segment or NULL reference on failure. - + - Gets or sets the value which affects the sequence of labels drawing relative to the map layers. + Removes all the line segments from the pattern. - See details in the description of tkVerticalPosition enumeration. - + - Gets or sets the method of label positioning. + Returns the number of all segments in the pattern. - + - Gets or sets the type of the label's orientation relative to the direction of the labelled shape. + Restores the state of the line segment from the string. - Applicable for the instance of the Labels class associated with polyline shapefiles, - i.e. obtained by Shapefile.Labels property while Shapefile.ShapefileType is polyline. + A string generated by LinePattern.Serialize() method. - + - Gets or sets the horizontal offset in pixels which is used to draw labels. + Draws a line pattern on the specified device context. - When labels are subject to the rotation, "horizontal" means "along the text width". - \see Labels.AutoOffset property + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on successful drawing and false on failure. - + - Gets or sets the vertical offset in pixels which is used to draw labels. + Draws a line pattern on the specified device context. - When labels are subject to rotation "vertical" means "along the text height". - \see Labels.AutoOffset property + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on successful drawing and false on failure. - + - Gets or sets the value which defines an alignment of text within label's frame. + Gets or sets the global callback object which is used for passing to the client + the information about the progress of time consuming tasks and errors. - Should be used with multiline labels. + An instance of the class which implements ICallback interface should be passed. + The class should be implemented by caller. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Turns on or off the auto offset behaviour. + Inserts line definition at the specified position of the pattern. - - When set to true, Labels.OffsetX and Labels.OffsetY property will be changed - automatically according to the size of symbols for parent shape points to avoid overlaps. - Applicable for point and multipoint shapefiles only. - + The index to insert the new line segment at. + The color of the line. + The width of the line. + The style of the line. + True on success and false otherwise. - + - Sets horizontal and vertical alignment of labels. + Insert marker definition on the pattern at the specified position. + The index to insert the new segment at. + The type of marker. + True on success and false otherwise. - + - Gets or sets the method to save and restore the state labels. + Gets or sets a string value associated with the instance of the class. + It can store any information provided developer. - See details in tkSavingMode enumeration. - + - Gets or sets the value which indicates whether the labels will be visible on the map. + Retrieves the numeric code of the last error that took place in the class. + The usage of this property clears the error code. - + - Gets or sets an expression which defines what shapes should be labelled on the map. + Removes a segment stored at the specified position of the pattern. - Applicable only to the instances of the Labels class associated with shapefile, i.e. - obtained by Shapefile.Labels property. - \code - Labels lb = new Labels(); - lb.VisibilityExpression = "[Area] > 100 and [population] > 100000"; - \endcode + The position to remove the segment at. + True on success and false otherwise. - + - Is not implemented. + Saves the state of the object to the string. + A string with serialized state. - + - Gets or sets the value which indicates whether labels with the same text should be drawn. + Gets or sets the transparency of the line pattern. The value ranges from 0(opaque) to 255(transparent). - When set to true only the labels with unique text will be drawn on map. The choice of label - to draw depends on their position in the list and the fact of belonging to the visualization category. + The default value is 255. The setting affects the drawing of both lines and markers. - + - Gets or sets the maximum scale at which labels are visible on the map. + Gets the text description of the specified error code. - \see Labels.DynamicVisibility, AxMap.CurrentScale + The numeric error code retrieved by ShapeDrawingOptions.LastErrorCode property. + The description of the error. - + - Gets or sets the minimum size of the shape in pixels to be labelled at the current map scale. + Gets the reference to the line segment stored at the specified position in the pattern. + The index of the segment. + The reference to the line segment or NULL reference on failure. - + - Get or sets the minimum scale at which labels are visible on the map. + Changes line segment at the specified position to the new one. - \see Labels.DynamicVisibility, AxMap.CurrentScale + The index of segment. + The reference to the new segment. - + - Gets or sets the minimum zoom at which labels are visible on the map. + Holds information about a single line or marker in the line pattern represented by %LinePattern class. - - - - Gets or sets the maximum zoom at which labels are visible on the map. + Here is a diagram for the LineSegment class. + \dot + digraph segm_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + segm [ label="LineSegment" URL="\ref LineSegment"]; + + node [color = tan peripheries = 1 height = 0.3, width = 1.0]; + ptrn [ label="LinePattern" URL="\ref LinePattern"]; + + edge [ dir = "none", arrowhead="open", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + ptrn -> segm [ URL="\ref LinePattern.get_Line()", tooltip = "Labels.get_Line()", headlabel = " n"]; + } + \enddot + Graph description + \new48 Added in version 4.8 + + + + Gets or sets the color of the line or marker. - + - Gets or sets the value which affects the collision avoidance routine. - Two labels are considered overlapping when the distance between their bounding rectangles - is less then this value. + Draws a line segment on the specified device context. - \see Labels.AvoidCollisions + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on successful drawing and false on failure. - + - Gets or sets the value which turns the dynamic visibility on or off. + Draws a line segment on the specified device context. - - When set to true, labels will be visible only in the range of scales set by Labels.MinVisibleScale and Labels.MinVisibleScale. - + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on successful drawing and false on failure. - + - Gets or sets the value which indicates whether a routine for preventing of label overlaps will be used. + Gets or sets the style of the line. - When set to true overlapping labels won't be drawn. - + - Gets or sets the color of the label's shadow. + Gets or sets the type of the line segment, either line or marker. - \see ShadowVisible - + - Gets or sets the horizontal offset of the label's shadow. + Gets or sets the width of the line. - \see ShadowVisible - + - Gets or sets the vertical offset of the label's shadow. + Gets or sets the marker for the line segment. - \see ShadowVisible - + - Gets or sets the value which indicates whether label's shadow is visible. + Gets or sets the value which indicates whether the first marker in the line should be rotated by 180 degrees. - + - Gets or sets the color of the halo around label's text. + Gets or sets the interval between markers in pixels. - \see Labels.HaloVisible - + - Gets or sets the size of the halo drawn around label's text. + Gets or sets the offset for the marker. - \see Labels.HaloVisible + The first marker will be positioned with offset from + the beginning of polyline by this value. - + - Gets or sets the value which indicates whether label's halo is visible. + Gets or set the orientation of the marker symbols relative to the polyline. - + - Gets or sets the value which indicates whether the font of labels is bold. + Gets or sets the outline color of the marker. - + - Gets or sets the color of the label font. + Gets or sets the size of marker in pixels. - + + - Gets or sets the second color of the label font. It is used to set color gradient for the font. + Gets the measured area (in square meters if WGS84 compatible projection is set for map and in current square map units otherwise). - \see Labels.FontGradientMode - + - Gets or sets the gradient mode for the labels. + Clears all measurements. - \see Labels.FontColor2 - + - Gets or sets the value which indicates whether the font of labels is italic. + Saves the state of the class to the string + A string with the state or an empty string on failure. + \new493 Added in version 4.9.3 - + - Gets or sets the name of the font to draw labels with, e.g. Arial. + Restores the state of object from the string. + A string generated by Measuring.Serialize() method + True on success. + \new493 Added in version 4.9.3 - + - Sets the color of the font outline. + Finishes measuring. The measured path won't be cleared from map immediately. - \see Labels.FontOutlineVisible - + - Gets or sets the value which indicates whether font outline is visible. The default value is false. + Gets value indicating whether measurement was stopped. - + - Gets or sets the width of the font outline. The default value is 1. + Gets the length of measured path (in meters if WGS84 compatible projection is set for map and in current map units otherwise). - \see FontOutlineVisible - + - Gets or sets the size of the font to draw labels with. + The type of measurement, either distance or area. - + - Gets or sets the value which indicates whether the font of labels is struck out. + Gets or sets a value indicating whether the finished path will be preserved on map + when map cursor changes to something other than cmMeasure. - + - Gets or sets the transparency of the font. A values between 0 (transparent) to 255 (opaque) can be used. + Gets or sets a value indicating whether bearing of the line segments will be displayed. - The default value is 255. Values which fall outside the specified range will be - corrected to the closest acceptable value without reporting an error. + \new493 Added in version 4.9.3 - + - Gets or sets the value which indicates whether the font of labels is struck out. + Gets number of points in the measured path. - + - Gets or sets the color of the frame's background. + Undoes entering of the last point in the path. - + True on success. - + - Gets or sets the second color of the frame's background. + Gets an area within the path polygon including an additional point (typically the current position of mouse cursor). - , Labels.FrameGradientMode + X coordinate of the last point (in map coordinates). + Y coordinate of the last point (in map coordinates). + Area in square meters if WGS84 compatible projection is set for map and in current square map units otherwise. - + - Gets or sets the type of gradient for the frame of the label. + Gets coordinates of specified point in the path. - - For all values other than gmNone a gradient - starting from Labels.FrameBackColor and ending by Labels.FrameBackColor2 will be applied. - + Index of a point. + X coordinate of the point in map coordinates. + Y coordinate of the point in map coordinates. + True on success. - + - Gets or sets the outline color of the label's frame + Gets a value indicating whether calculations are performed taking into account the shape of Earth + (when map projection is defined), or on 2D plane (Euclidean geometry). - + \new491 Added in version 4.9.1 - + - Gets or sets the outline style of the label's frame. + Gets or sets a Callback object which handles progress and error messages. - + \new493 Added in version 4.9.3 + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Gets or sets the width of the outline of the label's frame. + Returns true if measured path contains at least one point. - + \new493 Added in version 4.9.3 - + - Gets or sets the horizontal distance between the text of the label and its frame. + Gets or sets type of the bearing to be display for line segments. + \new493 Added in version 4.9.3 - + - Gets or sets the vertical distance between the text of the label and its frame. + Gets or sets a value indicating whether length of the line segments will be displayed. + \new493 Added in version 4.9.3 - + - Gets or sets the transparency of the label's frame. A values between 0 (transparent) to 255 (opaque) can be used. + Gets or sets type of the length units to be displayed. - The default value is 255. Values which fall outside the specified range will be - corrected to the closest acceptable value without reporting an error. + \new493 Added in version 4.9.3 - + - Gets or sets the shape of the label's frame. + Gets or sets the area units to be displayed. + \new493 Added in version 4.9.3 - + - Gets or sets the values which indicates whether label's frame is visible. + Gets or sets angle format to be used to display bearing. + \new493 Added in version 4.9.3 - + - Gets or sets rendering hint to be used during GDI+ rendering. + Gets or sets the number of decimal degrees to be used to display bearing. - This property will be ignored if GlobalSettings.AutoChooseRenderingHintForLabels is set to true. + This setting is not used when AngleFormat is set to minutes or seconds. + \new493 Added in version 4.9.3 - + - Gets or sets the formatting to be used for floating point numbers during generation of labels. + Gets or sets the number of decimal degrees to be used to display area. - See acceptable formats in description of C printf function. - The commonly used values may be: %g (shortest representation), %.2f (two decimal points). \new493 Added in version 4.9.3 - + - Provides means for defining custom pattern from lines and point symbols for rendering polyline layers. + Gets or sets the number of decimal degrees to be used to display length. - The line pattern consists of line segments which can be representing by lines of various style, - width and color or by markers. Line segments are drawn one atop of the other in the sequence defined - in the line pattern. \n\n - Here is a diagram for the LinePattern class. - \dot - digraph pattern_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - segm [ label="LineSegment" URL="\ref LineSegment"]; - - node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; - ptrn [label="LinePattern" URL="\ref LinePattern"]; - - node [style = dashed, color = gray]; - sdo [ label="ShapeDrawingOptions" URL="\ref ShapeDrawingOptions"]; - - edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - sdo -> ptrn [ URL="\ref ShapeDrawingOptions.LinePattern", tooltip = "ShapeDrawingOptions.LinePattern", headlabel = " 1"]; - ptrn -> segm [ URL="\ref LinePattern.get_Line()", tooltip = "LinePattern.get_Line()", headlabel = " n"]; - } - \enddot - Graph description - \new48 Added in version 4.8 - - - - Adds a line segment to the pattern. - - The color of the line. - The width of the line. - The style of the line. - - - - Adds a segment represented by point symbol (marker). - - The type of the marker. - Reference to the newly added segment or NULL reference on failure. - - - - Removes all the line segments from the pattern. - - - - - Restores the state of the line segment from the string. - - A string generated by LinePattern.Serialize() method. - - - - Draws a line pattern on the specified device context. - - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on successful drawing and false on failure. - - - - Draws a line pattern on the specified device context. - - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on successful drawing and false on failure. + \new493 Added in version 4.9.3 - + - Inserts line definition at the specified position of the pattern. + Gets or sets a value indicating whether vertices of the measured path will be visible. - The index to insert the new line segment at. - The color of the line. - The width of the line. - The style of the line. - True on success and false otherwise. + \new493 Added in version 4.9.3 - + - Insert marker definition on the pattern at the specified position. + Gets or sets line color to display measured path. - The index to insert the new segment at. - The type of marker. - True on success and false otherwise. + \new493 Added in version 4.9.3 - + - Removes a segment stored at the specified position of the pattern. + Gets or sets fill color for polygon display. - The position to remove the segment at. - True on success and false otherwise. + \new493 Added in version 4.9.3 - + - Saves the state of the object to the string. + Gets or sets fill transparency for polygon display. - A string with serialized state. + \new493 Added in version 4.9.3 - + - Gets the text description of the specified error code. + Gets or sets line width to display measured path. - The numeric error code retrieved by ShapeDrawingOptions.LastErrorCode property. - The description of the error. + \new493 Added in version 4.9.3 - + - Gets the reference to the line segment stored at the specified position in the pattern. + Gets or sets line style to display measured path. - The index of the segment. - The reference to the line segment or NULL reference on failure. + \new493 Added in version 4.9.3 - + - Changes line segment at the specified position to the new one. + Gets or sets a value indicating whether labels with indices of points will be visible near the vertices. - The index of segment. - The reference to the new segment. + \new493 Added in version 4.9.3 - + - Returns the number of all segments in the pattern. + Gets or sets a value indicating whether accumulated length will be shown in brackets for each line segment. + \new493 Added in version 4.9.3 - + - Gets or sets the global callback object which is used for passing to the client - the information about the progress of time consuming tasks and errors. + Gets or sets the type of user input to be used to undo the last point of the measured path. - An instance of the class which implements ICallback interface should be passed. - The class should be implemented by caller. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + \new493 Added in version 4.9.3 - + - Gets or sets a string value associated with the instance of the class. - It can store any information provided developer. + A text string associated with object. Any value can be stored by developer in this property. + \new493 Added in version 4.9.3 - + - Retrieves the numeric code of the last error that took place in the class. + Gets the code of last error which took place inside this object. - The usage of this property clears the error code. + \new493 Added in version 4.9.3 - + - Gets or sets the transparency of the line pattern. The value ranges from 0(opaque) to 255(transparent). + Gets the description of the specific error code. - The default value is 255. The setting affects the drawing of both lines and markers. + The error code returned by LastErrorCode property. + String with the description. + \new493 Added in version 4.9.3 - + - Holds information about a single line or marker in the line pattern represented by %LinePattern class. + A point object represents a point with x, y, Z, and M values. Shapes created by adding point objects to the shape. - Here is a diagram for the LineSegment class. + Here is a diagram for the Point class. \dot - digraph segm_diagram { + digraph point_diagram { nodesep = 0.3; ranksep = 0.3; splines = ortho; node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - segm [ label="LineSegment" URL="\ref LineSegment"]; + pnt [ label="Point" URL="\ref Point"]; node [color = tan peripheries = 1 height = 0.3, width = 1.0]; - ptrn [ label="LinePattern" URL="\ref LinePattern"]; + shp [ label="Shape" URL="\ref Shape"]; - edge [ dir = "none", arrowhead="open", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - ptrn -> segm [ URL="\ref LinePattern.get_Line()", tooltip = "Labels.get_Line()", headlabel = " n"]; + edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + shp -> pnt [ URL="\ref Shape.get_Point()", tooltip = "Labels.get_Point()", headlabel = " n"]; } \enddot Graph description - \new48 Added in version 4.8 - - - - Draws a line segment on the specified device context. - - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on successful drawing and false on failure. - - - - Draws a line segment on the specified device context. - - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on successful drawing and false on failure. - + - Gets or sets the color of the line or marker. + Creates an exact copy of the point. + The new point. + \new48 Added in version 4.8 - + - Gets or sets the style of the line. + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + \deprecated v 4.9.3 %Point class doesn't define any callback or error messages. - + - Gets or sets the type of the line segment, either line or marker. + The key may be used by the programmer to store any string data associated with the object. + \deprecated v 4.9.3 Key string is no longer stored for performance reasons and to spare RAM. - + - Gets or sets the width of the line. + Retrieves the last error generated in the object. + \deprecated v 4.9.3 %Point class doesn't define any error messages. - + - Gets or sets the marker for the line segment. + Gets or sets the measure value of this point. Measures only apply to shapefiles with measure data. - + - Gets or sets the value which indicates whether the first marker in the line should be rotated by 180 degrees. + Gets or sets the Z value of this point. - + - Gets or sets the interval between markers in pixels. + Retrieves the error message associated with the specified error code. + The error code for which the error message is required. + The error message description for the specified error code. + \deprecated v 4.9.3 %Point class doesn't define any error messages. - + - Gets or sets the offset for the marker. + Gets or sets the x value of the point. - The first marker will be positioned with offset from - the beginning of polyline by this value. - + - Gets or set the orientation of the marker symbols relative to the polyline. + Gets or sets the y value of the point. - + - Gets or sets the outline color of the marker. + Sets the X, Y, and Z values of this point. + The new X value. + The new Y value. + Optional. The new Z value. Defaults to 0.0 if not specified. - + - Gets or sets the size of marker in pixels. + A shape object represents a geometric shape which can be added to a shapefile which is displayed in the map. - - - + Here is a diagram for the Shape class. + \dot + digraph shape_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + pnt [ label="Point" URL="\ref Point"]; + shp [ label="Shape" URL="\ref Shape"]; + + node [color = tan peripheries = 1 height = 0.3, width = 1.0]; + sf [ label="Shapefile" URL="\ref Shapefile"]; + + edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + shp -> pnt [ URL="\ref Shape.get_Point()", tooltip = "Table.get_Point()", headlabel = " n"]; + sf -> shp [ URL="\ref Shapefile.get_Shape()", tooltip = "Shapefile.get_Shape", headlabel = " n"]; + } + \enddot + Graph description + + - Clears all measurements. + Calculates the area of the shape. For non-polygon shapes this property will return 0.0. + The area will always be returned in current map units. + No corrections are made to take into account the curved shape of Earth. + \new48 Added in version 4.8 - + - Saves the state of the class to the string + Generates a shape which represents a boundary of the current shape. - A string with the state or an empty string on failure. - \new493 Added in version 4.9.3 + The reference to the resulting shape or NULL on failure. + \new48 Added in version 4.8 - + - Restores the state of object from the string. + Builds a buffer of the specified distance around the shape. - A string generated by Measuring.Serialize() method - True on success. - \new493 Added in version 4.9.3 + The buffer distance in map units. + The number of segments use to approximate a circle buffer. + The reference to the resulting shape which holds the buffer or NULL reference on failure. + \new48 Added in version 4.8 - + - Finishes measuring. The measured path won't be cleared from map immediately. + Calculates a center of the shape's bounding box. + \new48 Added in version 4.8 - + - Undoes entering of the last point in the path. + Calculates a centroid (center of mass) of the shape. - True on success. + \new48 Added in version 4.8 - + - Gets an area within the path polygon including an additional point (typically the current position of mouse cursor). + Performs clipping operation with 2 shapes. - X coordinate of the last point (in map coordinates). - Y coordinate of the last point (in map coordinates). - Area in square meters if WGS84 compatible projection is set for map and in current square map units otherwise. + The available operation are: + - difference; + - intersection; + - symmetrical difference; + - union; + . + Note that clClip operation will yield the same result as intersection. + + The second shape for the operation. + The operation to perform. + The reference to the resulting shape or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets coordinates of specified point in the path. + Creates a deep copy of this object with the same type, parts and points. - Index of a point. - X coordinate of the point in map coordinates. - Y coordinate of the point in map coordinates. - True on success. + The copy of the shape. + \new48 Added in version 4.8 - + - Gets the description of the specific error code. + Tests a "contains" relation between 2 shapes. - The error code returned by LastErrorCode property. - String with the description. - \new493 Added in version 4.9.3 + The second shape. + True if this shape contains the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets the measured area (in square meters if WGS84 compatible projection is set for map and in current square map units otherwise). + Builds a convex hull around the current shape. + A new shape with convex hull of the current shape or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets value indicating whether measurement was stopped. + Creates a new shape of the specified type. + The type of the shape to be created. + A boolean value representing the success or failure of creating the new shape. - + - Gets the length of measured path (in meters if WGS84 compatible projection is set for map and in current map units otherwise). - + Initializes the Shape object and fills it with the geometry defined by the input string. + The input string should be in the + serialized string format as produced by the function Shape.SerializeToString. + The serialized string to load. + A boolean value representing the success or failure of loading the shape. - + - The type of measurement, either distance or area. + Tests a "crosses" relation between 2 shapes. + The second shape. + True if this shape crosses the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets or sets a value indicating whether the finished path will be preserved on map - when map cursor changes to something other than cmMeasure. + Deletes a part from a shape. + The index of the part to be deleted. + A boolean value representing the success or failure of deleting the part. - + - Gets or sets a value indicating whether bearing of the line segments will be displayed. + Deletes a point in the shape. - \new493 Added in version 4.9.3 + The index of the point in the shape to be deleted. + A boolean value representing the success or failure of deleting the point in the shape. - + - Gets number of points in the measured path. + Tests a "disjoint" relation between 2 shapes. + The second shape. + True if this shape is disjoint from the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets a value indicating whether calculations are performed taking into account the shape of Earth - (when map projection is defined), or on 2D plane (Euclidean geometry). + Calculates the distance between 2 shapes. - \new491 Added in version 4.9.1 + The second shape. + The calculated distance. + \new48 Added in version 4.8 - + - Gets or sets a Callback object which handles progress and error messages. + Tests an "equals" relation between 2 shapes. - \new493 Added in version 4.9.3 - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + The second shape. + True if this shape is equal to the second shape and false if it is not. + \new48 Added in version 4.8 - + - Returns true if measured path contains at least one point. + Splits multipart shape into simple shapes. - \new493 Added in version 4.9.3 + Holes of the polygon will not be considered as separate shapes. However + if a polygon holds several not nested rings they will be passed to output as individual polygons. + The array of Shape type with the resulting shapes. + The on success and false otherwise. + \new48 Added in version 4.8 - + - Gets or sets type of the bearing to be display for line segments. + Returns binary representation of the shape data. - \new493 Added in version 4.9.3 + The binary data will have the same format as disk representation of the shapefile. + The byte array with shape data. + True on success and false otherwise. + \new48 Added in version 4.8 - + - Gets or sets a value indicating whether length of the line segments will be displayed. + Gets the extents of the shape. - \new493 Added in version 4.9.3 - + - Gets or sets type of the length units to be displayed. + Fixes the shape in case it is not valid. - \new493 Added in version 4.9.3 + Converts the data to GEOS geometry and builds a small buffer. + Call Shape.IsValid to find out the invalid shapes. + The fixed shape. + \new48 Added in version 4.8 - + - Gets or sets the area units to be displayed. + Fixes the shape in case it is not valid. - \new493 Added in version 4.9.3 + The units of measure of the coordinate system. + The fixed shape. + \new494 Added in version 4.9.4 - + - Gets or sets angle format to be used to display bearing. + Calculates the intersection of 2 shapes. - \new493 Added in version 4.9.3 + In comparison with Shape.Clip this function returns all the results of intersection + even if they have different shape type. For example the intersection of 2 polygons can hold: + new polygons, polylines and points simultaneously. + The second shape. + The array of Shape type with the results of intersection. + True in case at least one shape is returned and false otherwise. + \new48 Added in version 4.8 - + - Gets or sets the number of decimal degrees to be used to display bearing. + Gets or sets a callback object for reporting about the errors. - This setting is not used when AngleFormat is set to minutes or seconds. - \new493 Added in version 4.9.3 + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Gets or sets the number of decimal degrees to be used to display area. + Restores the state of the shape from binary representation obtained by Shape.ExportToBinary. - \new493 Added in version 4.9.3 + The byte array with the state of shape. + True on success and false otherwise. + \new48 Added in version 4.8 - + - Gets or sets the number of decimal degrees to be used to display length. + Inserts a part into the shape. - \new493 Added in version 4.9.3 + + Parts are used to create polygons with holes. Parts with points ordered in a clockwise direction + are filled. Parts with points ordered in a counter-clockwise direction are cut out. Only clockwise parts should be used to + define the outer-most regions of a shape. + + The index of the first point in the part to be inserted. + The part index desired. This value may be modified if it is not possible to use the desired part index. + A boolean value representing the success or failure of inserting the part into the shape. - + - Gets or sets a value indicating whether vertices of the measured path will be visible. + Inserts the specified point object into the shape using the desired point index if possible. - \new493 Added in version 4.9.3 + The point object to be inserted into the shape. + Reference parameter. The index where the point will be placed if possible. If the desired index + cannot be used, the actual index will be returned. + A boolean value representing the success or failure of inserting the point into the shape. - + - Gets or sets line color to display measured path. + Calculates the interior point of the shape. Is applicable for polygon shapes only. - \new493 Added in version 4.9.3 + The algorithm works as following: + - a line is defined which crosses the bounding box of the polygon horizontally in its center; + - the intersection of this line and polygon is calculated which can be represented by single segment or by a number of segments; + - the longest segment is then chosen and the point on it's center is returned. + \new48 Added in version 4.8 - + - Gets or sets fill color for polygon display. + Tests an "intersects" relation between 2 shapes. - \new493 Added in version 4.9.3 + The second shape. + True if this shape intersects the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets or sets fill transparency for polygon display. + Returns a boolean value which indicates whether a shape is valid. - \new493 Added in version 4.9.3 + + Shapes is considered to be valid when it meets specific topological rules for particular shape type. + + \new48 Added in version 4.8 - + - Gets or sets line width to display measured path. + Returns the string with the description of reason why shape was considered invalid. - \new493 Added in version 4.9.3 + \see Shape.IsValid. + \new48 Added in version 4.8 - + - Gets or sets line style to display measured path. + The key may be used by the programmer to store any string data associated with the object. - \new493 Added in version 4.9.3 - + - Gets or sets a value indicating whether labels with indices of points will be visible near the vertices. + Retrieves the last error generated in the object. - \new493 Added in version 4.9.3 - + - Gets or sets a value indicating whether accumulated length will be shown in brackets for each line segment. + Calculates the length of polyline shape. - \new493 Added in version 4.9.3 + The length will always be returned in current map units. + No corrections are made to take into account the curved shape of the Earth. - + - Gets or sets the type of user input to be used to undo the last point of the measured path. + Gets the number of parts contained in the shape. - \new493 Added in version 4.9.3 + A polygon shape may have several parts. An example of this would be a + doughnut shape. The outermost perimeter would be one part, and the hole cut out of the center making up the innermost + perimeter would be the second part. The outermost perimeter would be specified by a series of points arranged in clockwise + order, meaning that this part will be filled. The innermost perimeter would be specified by a series of points arranged in + counter-clockwise order, meaning that this part will not be filled. - + - A text string associated with object. Any value can be stored by developer in this property. + Tests an "overlaps" relation between 2 shapes. - \new493 Added in version 4.9.3 + The second shape. + True if this shape overlaps the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets the code of last error which took place inside this object. + Calculates the perimeter of shape. Is applicable for polygon shapes only. - \new493 Added in version 4.9.3 + The length will always be returned in current map units. + No corrections are made to take into account the curved shape of the Earth. + \new48 Added in version 4.8 - + - A point object represents a point with x, y, Z, and M values. Shapes created by adding point objects to the shape. + Performs a test to find out whether a given point lies within the polygon. - Here is a diagram for the Point class. - \dot - digraph point_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - pnt [ label="Point" URL="\ref Point"]; - - node [color = tan peripheries = 1 height = 0.3, width = 1.0]; - shp [ label="Shape" URL="\ref Shape"]; - - edge [ dir = "none", style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - shp -> pnt [ URL="\ref Shape.get_Point()", tooltip = "Labels.get_Point()", headlabel = " n"]; - } - \enddot - Graph description + The point to test. + True if points lies within polygon and false otherwise. - + - Creates an exact copy of the point. + Tests the specified relation between 2 shapes. - The new point. + This method works the same as individual overloads like Shape.Intersects, Shape.Overlaps, etc. + The second shape. + The relation to test. + True in case this relation is actually takes place and false if it is not. \new48 Added in version 4.8 - - - Retrieves the error message associated with the specified error code. - - The error code for which the error message is required. - The error message description for the specified error code. - \deprecated v 4.9.3 %Point class doesn't define any error messages. - - + - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + Changes the order of points within shape part to the opposite. - \deprecated v 4.9.3 %Point class doesn't define any callback or error messages. + The property can be useful to to ensure proper topology for polygons. + The points of outer ring of polygon must have clockwise order, while the points of its holes + must be specified in counter-clockwise order. + The index of part to reverse the order of points. + True on success and false otherwise. + \new48 Added in version 4.8 - + - The key may be used by the programmer to store any string data associated with the object. + Provides a string representing the shape's geometry. - \deprecated v 4.9.3 Key string is no longer stored for performance reasons and to spare RAM. + The string will be in the serialized string format and can be reloaded with Shape.CreateFromString. + A string representing the shape geometry. - + - Retrieves the last error generated in the object. + Gets or sets the type of the shape. - \deprecated v 4.9.3 %Point class doesn't define any error messages. + The shape's type must match the type of the shapefile the shape is to be added to + except for shapes of type SHP_NULLSHAPE. - + - Gets or sets the measure value of this point. Measures only apply to shapefiles with measure data. + Tests a "touches" relation between 2 shapes. + The second shape. + True if this shape touches the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets or sets the Z value of this point. + Tests a "within" relation between 2 shapes. + The second shape. + True if this shape lies within the second shape and false if it is not. + \new48 Added in version 4.8 - + - Gets or sets the x value of the point. + Returns the index of the last point in the part. + The index of the part. + The index of the point. + \new48 Added in version 4.8 - + - Gets or sets the y value of the point. + Retrieves the error message associated with the specified error code. + The error code for which the error message is required. + The error message description for the specified error code. - + - A shape object represents a geometric shape which can be added to a shapefile which is displayed in the map. + Gets or sets the first point index in the specified part. - Here is a diagram for the Shape class. - \dot - digraph shape_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - pnt [ label="Point" URL="\ref Point"]; - shp [ label="Shape" URL="\ref Shape"]; - - node [color = tan peripheries = 1 height = 0.3, width = 1.0]; - sf [ label="Shapefile" URL="\ref Shapefile"]; - - edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - shp -> pnt [ URL="\ref Shape.get_Point()", tooltip = "Table.get_Point()", headlabel = " n"]; - sf -> shp [ URL="\ref Shapefile.get_Shape()", tooltip = "Shapefile.get_Shape", headlabel = " n"]; - } - \enddot - Graph description + The index of the part for which the first point index is required. + The index of the first point in the specified part. - + - Generates a shape which represents a boundary of the current shape. + Returns part of the shape as a new shape. - The reference to the resulting shape or NULL on failure. + The initial shape and the returned one doesn't shape any common memory. + The index of part to return. + The reference to the new shape and NULL reference on failure. \new48 Added in version 4.8 - + - Builds a buffer of the specified distance around the shape. + Returns a boolean value which indicates whether points of the shape part are placed in the clockwise order. - The buffer distance in map units. - The number of segments use to approximate a circle buffer. - The reference to the resulting shape which holds the buffer or NULL reference on failure. + The index of part. + True for the clockwise order, and false for counter-clockwise. \new48 Added in version 4.8 - + - Performs clipping operation with 2 shapes. + Gets or sets the specified point in the shape. - The available operation are: - - difference; - - intersection; - - symmetrical difference; - - union; - . - Note that clClip operation will yield the same result as intersection. - - The second shape for the operation. - The operation to perform. - The reference to the resulting shape or NULL reference on failure. - \new48 Added in version 4.8 + The index of the point which is to be accessed in the shape. + The specified point in the shape. - + - Creates a deep copy of this object with the same type, parts and points. + Gets the coordinates of the specified point. - The copy of the shape. + It's highly recommended to use this property rather than Shape.get_Point, + for considerable performance boost when Shapefile.FastMode is set to true. + The index of point. + The x coordinate. + The y coordinate. + True on successful retrieval and false on wrong index of point. \new48 Added in version 4.8 - + - Tests a "contains" relation between 2 shapes. + Gets the number of points contained in the shape. - The second shape. - True if this shape contains the second shape and false if it is not. - \new48 Added in version 4.8 + There is a confusion with name casing for this property. + It's actually spelled 'get_NumPoints' in the source code. + However because of the known bug in PIA generation process the property + ended up spelled 'get_numPoints' in earlier version of PIAs. After some hesitation we decided to keep it that way. + See description of the bug here: http://stackoverflow.com/questions/3179676/c-exposed-property-for-com-in-idl-is-showing-as-lower-case-all-of-a-sudden - + - Builds a convex hull around the current shape. + Sets the coordinates of the specified point. - A new shape with convex hull of the current shape or NULL reference on failure. + It's highly recommended to use this property rather than Shape.get_Point, + for considerable performance boost when Shapefile.FastMode is set to true. + The index of point. + The x coordinate. + The y coordinate. + True on success and false on the invalid index. \new48 Added in version 4.8 - + - Creates a new shape of the specified type. + Sets the index of the first point in part. - The type of the shape to be created. - A boolean value representing the success or failure of creating the new shape. - - - - Initializes the Shape object and fills it with the geometry defined by the input string. - The input string should be in the - serialized string format as produced by the function Shape.SerializeToString. - The serialized string to load. - A boolean value representing the success or failure of loading the shape. + The index of part. + The index of point. - + - Tests a "crosses" relation between 2 shapes. + Replaces the point with the specified index with new one. - The second shape. - True if this shape crosses the second shape and false if it is not. - \new48 Added in version 4.8 + The index of point to replace. + The new point. - + - Deletes a part from a shape. + Adds a point to the shape. - The index of the part to be deleted. - A boolean value representing the success or failure of deleting the part. + The x coordinate of the point. + The y coordinate of the point. + The index of the new point. + \new490 Added in version 4.9.0 - + - Deletes a point in the shape. + Calculates closest points of the 2 shapes - The index of the point in the shape to be deleted. - A boolean value representing the success or failure of deleting the point in the shape. + Second shape + Polyline shape with 2 points, the first one - closest point of this shape, the second one - closest point of parameter shape. + Uses GEOS implementation, works for all shape types. For any point lying within polygon the closest point between it and polygon will be the point itself. + \new491 Added in version 4.9.1 - + - Tests a "disjoint" relation between 2 shapes. + Imports shape data from WKT format. - The second shape. - True if this shape is disjoint from the second shape and false if it is not. - \new48 Added in version 4.8 + Shape data in WKT format. + True on success and false otherwise. + \new491 Added in version 4.9.1 - + - Calculates the distance between 2 shapes. + Imports shape data from WKT format. - The second shape. - The calculated distance. - \new48 Added in version 4.8 + String in WKT format with shape data. + \new490 Added in version 4.9.0 - + - Tests an "equals" relation between 2 shapes. + Creates a deep copy of shape to another instance, including points and parts. - The second shape. - True if this shape is equal to the second shape and false if it is not. - \new48 Added in version 4.8 + Source shape to copy from. + True on success. + \new491 Added in version 4.9.1 - + - Splits multipart shape into simple shapes. + Gets M value for specified point. - Holes of the polygon will not be considered as separate shapes. However - if a polygon holds several not nested rings they will be passed to output as individual polygons. - The array of Shape type with the resulting shapes. - The on success and false otherwise. - \new48 Added in version 4.8 + Index of point. + M value. + True in case there are M values for current shape type. + \new491 Added in version 4.9.1 - + - Returns binary representation of the shape data. + Gets M value for specified point. - The binary data will have the same format as disk representation of the shapefile. - The byte array with shape data. - True on success and false otherwise. - \new48 Added in version 4.8 + Index of point. + Z value. + True in case there are Z values for current shape type. + \new491 Added in version 4.9.1 - + - Fixes the shape in case it is not valid. + Puts M value for specified point. - Converts the data to GEOS geometry and builds a small buffer. - Call Shape.IsValid to find out the invalid shapes. - The fixed shape. - \new48 Added in version 4.8 + Index of point. + M value. + True on success. + \new491 Added in version 4.9.1 - + - Fixes the shape in case it is not valid. + Puts Z value for specified point. - The units of measure of the coordinate system. - The fixed shape. - \new494 Added in version 4.9.4 + Index of point. + Z value. + True on success. + \new491 Added in version 4.9.1 - + - Calculates the intersection of 2 shapes. + Returns a new shape which constitutes a buffer around original one. - In comparison with Shape.Clip this function returns all the results of intersection - even if they have different shape type. For example the intersection of 2 polygons can hold: - new polygons, polylines and points simultaneously. - The second shape. - The array of Shape type with the results of intersection. - True in case at least one shape is returned and false otherwise. - \new48 Added in version 4.8 + Buffer width (same units as shape coordinates are set with). + Number of segments to approximate curves. + True if buffer if single sided buffer is needed (works for polylines only). + Type of caps. + Type of joins. + Mitre limit. + New buffered shape on success or null on failure. + \new493 Added in version 4.9.3 - + - Restores the state of the shape from binary representation obtained by Shape.ExportToBinary. + Moves shape at specified offset. - The byte array with the state of shape. - True on success and false otherwise. - \new48 Added in version 4.8 + X component of offset. + Y component of offset. + \new493 Added in version 4.9.3 - + - Inserts a part into the shape. + Rotates shape around specified point. - - Parts are used to create polygons with holes. Parts with points ordered in a clockwise direction - are filled. Parts with points ordered in a counter-clockwise direction are cut out. Only clockwise parts should be used to - define the outer-most regions of a shape. - - The index of the first point in the part to be inserted. - The part index desired. This value may be modified if it is not possible to use the desired part index. - A boolean value representing the success or failure of inserting the part into the shape. + X coordinate to rotate shape around. + Y coordinate to rotate shape around. + Angle in degrees. + \new493 Added in version 4.9.3 - + - Inserts the specified point object into the shape using the desired point index if possible. + Splits shape with a provided polyline. - The point object to be inserted into the shape. - Reference parameter. The index where the point will be placed if possible. If the desired index - cannot be used, the actual index will be returned. - A boolean value representing the success or failure of inserting the point into the shape. + Polyline shape to split with. + An array of Shape type. + True on success. + \new493 Added in version 4.9.3 - + - Tests an "intersects" relation between 2 shapes. + Removes all the points and parts. - The second shape. - True if this shape intersects the second shape and false if it is not. - \new48 Added in version 4.8 + \new494 Added in version 4.9.4 - + - Tests an "overlaps" relation between 2 shapes. + Gets "flattened" shape type, i.e. Z and M components will be ignored. - The second shape. - True if this shape overlaps the second shape and false if it is not. - \new48 Added in version 4.8 + \new493 Added in version 4.9.3 - + - Performs a test to find out whether a given point lies within the polygon. + Returns true if the shape doesn't have any points. - The point to test. - True if points lies within polygon and false otherwise. + \new493 Added in version 4.9.3 - + + - Tests the specified relation between 2 shapes. + Creates a new instance of ShapeDrawingOptions class by copying all the properties. - This method works the same as individual overloads like Shape.Intersects, Shape.Overlaps, etc. - The second shape. - The relation to test. - True in case this relation is actually takes place and false if it is not. - \new48 Added in version 4.8 + The reference to the new instance of the ShapeDrawingOptions class or NULL reference on failure. - + - Changes the order of points within shape part to the opposite. + Restores the state of object from the string. - The property can be useful to to ensure proper topology for polygons. - The points of outer ring of polygon must have clockwise order, while the points of its holes - must be specified in counter-clockwise order. - The index of part to reverse the order of points. - True on success and false otherwise. - \new48 Added in version 4.8 + A string generated by ShapeDrawingOptions.Serialize() method. - + - Provides a string representing the shape's geometry. + Draws a line using the stored options on specified device context. - The string will be in the serialized string format and can be reloaded with Shape.CreateFromString. - A string representing the shape geometry. + The method can be used to draw map legend. + The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the drawing. + The height of the drawing. + A value which indicates whether or not vertices of the line will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Tests a "touches" relation between 2 shapes. + Draws a line using the stored options on the specified device context. - The second shape. - True if this shape touches the second shape and false if it is not. - \new48 Added in version 4.8 - - - - Tests a "within" relation between 2 shapes. - - The second shape. - True if this shape lies within the second shape and false if it is not. - \new48 Added in version 4.8 + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the drawing. + The height of the drawing. + A value which indicates whether or not vertices of the line will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Returns the index of the last point in the part. + Draws a point symbol using the stored options on the specified device context. - The index of the part. - The index of the point. - \new48 Added in version 4.8 + The method can be used to draw map legend. + The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Retrieves the error message associated with the specified error code. + Draws a point symbol using the stored options on the specified device context. - The error code for which the error message is required. - The error message description for the specified error code. + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Gets or sets the first point index in the specified part. + Draws a rectangle using the stored options on the specified device context. - The index of the part for which the first point index is required. - The index of the first point in the specified part. + The method can be used to draw map legend. + The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the drawing. + The height of the drawing. + A value which indicates whether or not vertices of the rectangle will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Returns part of the shape as a new shape. + Draws a rectangle using the stored options on the specified device context. - The initial shape and the returned one doesn't shape any common memory. - The index of part to return. - The reference to the new shape and NULL reference on failure. - \new48 Added in version 4.8 + The method can be used to draw map legend. + The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + The width of the drawing. + The height of the drawing. + A value which indicates whether or not vertices of the rectangle will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Returns a boolean value which indicates whether points of the shape part are placed in the clockwise order. + Draws a shape using the stored options on the specified device context. - The index of part. - True for the clockwise order, and false for counter-clockwise. - \new48 Added in version 4.8 + The method can be used to draw map legend. + The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + A shape to draw. Point, polyline and polygon shapes are supported. + A value which indicates whether or not vertices of the line will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Gets or sets the specified point in the shape. + Draws a shape using the stored options on the specified device context. - The index of the point which is to be accessed in the shape. - The specified point in the shape. + The method can be used to draw map legend. + The handle of the device context. + The x coordinate of the upper left corner of the drawing. + The y coordinate of the upper left corner of the drawing. + A shape to draw. Point, polyline and polygon shapes are supported. + A value which indicates whether or not vertices of the line will be drawn. + The width of the clipping rectangle. + The height of the clipping rectangle. + The back color of the device context the drawing is performed at. + The value should be specified to ensure correct blending when semi-transparent colors are used. + The alpha component of the back color of the device context the drawing is performed at. + Specify a value of 255 for the background color to be fully opaque, and 0 for the background to be transparent. + True on success and false otherwise. + \new495 Optional backAlpha parameter added in version 4.9.5 - + - Gets the coordinates of the specified point. + The graphical mode to be used to render symbology. - It's highly recommended to use this property rather than Shape.get_Point, - for considerable performance boost when Shapefile.FastMode is set to true. - The index of point. - The x coordinate. - The y coordinate. - True on successful retrieval and false on wrong index of point. - \new48 Added in version 4.8 - + - Sets the coordinates of the specified point. + Gets or sets the background color of the polygon fill. - It's highly recommended to use this property rather than Shape.get_Point, - for considerable performance boost when Shapefile.FastMode is set to true. - The index of point. - The x coordinate. - The y coordinate. - True on success and false on the invalid index. - \new48 Added in version 4.8 + It is used for polygon shapes when hatch fill is chosen. + \see FillType - + - Sets the index of the first point in part. + Gets or sets the value which indicates whether a background will be drawn when ShapeDrawingOptions.FillType is set to ftHatch. - The index of part. - The index of point. - + - Replaces the point with the specified index with new one. + Gets or sets the fill color of the shape. - The index of point to replace. - The new point. + The color is used for point and polygon shapes when ShapeDrawingOptions.FillType is equal to ftSimple or ftHatch, + or the gradient starting color is ShapeDrawingOptions.FillType is equal to ftGradient. - + - Adds a point to the shape. + Gets or sets the end color of the gradient fill. - The x coordinate of the point. - The y coordinate of the point. - The index of the new point. - \new490 Added in version 4.9.0 + It is used when ShapeDrawingOptions.FillType is equal to ftGradient. - + - Calculates closest points of the 2 shapes + Gets or sets the the value which defines the bounds of the gradient fill. - Second shape - Polyline shape with 2 points, the first one - closest point of this shape, the second one - closest point of parameter shape. - Uses GEOS implementation, works for all shape types. For any point lying within polygon the closest point between it and polygon will be the point itself. - \new491 Added in version 4.9.1 - + - Imports shape data from WKT format. + The type of the gradient to draw polygon fill of the point symbols and polygon shapes. - Shape data in WKT format. - True on success and false otherwise. - \new491 Added in version 4.9.1 + \see FillType, FillColor, FillColor2. - + - Imports shape data from WKT format. + The hatch style of the fill for point symbols and polygon shapes. - String in WKT format with shape data. - \new490 Added in version 4.9.0 + \see FillType, FillBgColor, FillBgTransparent. - + - Creates a deep copy of shape to another instance, including points and parts. + Gets or sets the angle of rotation of the polygon fill in degrees. - Source shape to copy from. - True on success. - \new491 Added in version 4.9.1 + Affects the rotation of gradient and texture fill. + \see FillType - + - Gets M value for specified point. + Gets or sets the transparency of the fill. Ranges from 0 (transparent) to 255 (opaque). - Index of point. - M value. - True in case there are M values for current shape type. - \new491 Added in version 4.9.1 - + - Gets M value for specified point. + The type of the polygon fill. See the enumeration for details. - Index of point. - Z value. - True in case there are Z values for current shape type. - \new491 Added in version 4.9.1 - + - Puts M value for specified point. + Gets or sets the value which indicates whether the fill is visible. - Index of point. - M value. - True on success. - \new491 Added in version 4.9.1 + Affects the drawing of point symbols and polygon shapes. - + - Puts Z value for specified point. + The name of the font to use for drawing point symbols when ShapeDrawingOptions.PointType is equal to pstCharacter. - Index of point. - Z value. - True on success. - \new491 Added in version 4.9.1 - + - Returns a new shape which constitutes a buffer around original one. + Retrieves the numeric code of the last error that took place in the instance class. - Buffer width (same units as shape coordinates are set with). - Number of segments to approximate curves. - True if buffer if single sided buffer is needed (works for polylines only). - Type of caps. - Type of joins. - Mitre limit. - New buffered shape on success or null on failure. - \new493 Added in version 4.9.3 + The usage of this property clears the error code. - + - Moves shape at specified offset. + Gets or sets the line color of the shapes. - X component of offset. - Y component of offset. - \new493 Added in version 4.9.3 + Affects the drawing of all shape types. - + - Rotates shape around specified point. + Gets or sets line pattern for rendering polyline shapefile. - X coordinate to rotate shape around. - Y coordinate to rotate shape around. - Angle in degrees. - \new493 Added in version 4.9.3 - + - Splits shape with a provided polyline. + Gets or sets the line style of the shapes. - Polyline shape to split with. - An array of Shape type. - True on success. - \new493 Added in version 4.9.3 + Affects the drawing of all shape types. - + - Removes all the points and parts. + Gets or sets the transparency of lines. Ranges from 0 (transparent) to 255 (opaque). - \new494 Added in version 4.9.4 - + - Calculates the area of the shape. For non-polygon shapes this property will return 0.0. + Gets or sets the value which indicates whether lines will be visible while drawing shapes. - The area will always be returned in current map units. - No corrections are made to take into account the curved shape of Earth. - \new48 Added in version 4.8 + This affects drawing of polylines, as well as the drawing of outline of points symbols and polygons. - + - Calculates a center of the shape's bounding box. + Gets or sets the width of the lines to draw shapes. - \new48 Added in version 4.8 - + - Calculates a centroid (center of mass) of the shape. + Gets or sets the picture which will be used as texture brush (ShapeDrawingOptions.FillType = ftPicture) + or point symbol (ShapeDrawingOptions.PointType = ptSymbolPicture). - \new48 Added in version 4.8 + The property affects the drawing of point symbols and polygons. - + - Gets the extents of the shape. + Gets or sets the coefficient for scaling picture horizontally. - + - Gets or sets a callback object for reporting about the errors. + Gets or sets the coefficient for scaling picture vertically. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Calculates the interior point of the shape. Is applicable for polygon shapes only. + Get or sets the ANSI code of the text character to use as point symbol. - The algorithm works as following: - - a line is defined which crosses the bounding box of the polygon horizontally in its center; - - the intersection of this line and polygon is calculated which can be represented by single segment or by a number of segments; - - the longest segment is then chosen and the point on it's center is returned. - \new48 Added in version 4.8 - + - Returns a boolean value which indicates whether a shape is valid. + Gets or sets the rotation of the point symbol in degrees. - - Shapes is considered to be valid when it meets specific topological rules for particular shape type. - - \new48 Added in version 4.8 - + - Returns the string with the description of reason why shape was considered invalid. + Gets or sets the type of reflection to apply to the point symbol. - \see Shape.IsValid. - \new48 Added in version 4.8 + This value is used when ShapeDrawingOptions.PointType is equal to ptSymbolFontCharacter or ptSymbolPicture. + \new495 Added in version 4.9.5 - + - The key may be used by the programmer to store any string data associated with the object. + Gets or sets the predefined shape for the point symbol. + It is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. - + - Retrieves the last error generated in the object. + Gets or sets the number of sides for some of the predefined symbols such as regular, star or cross. + This value is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. - + - Calculates the length of polyline shape. + Gets or sets the side ratio for some of the predefined point symbols such as regular, star and cross. - The length will always be returned in current map units. - No corrections are made to take into account the curved shape of the Earth. + This value is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. - + - Gets the number of parts contained in the shape. + Gets or sets the size of the point symbol including predefined symbols, characters and pictures. - A polygon shape may have several parts. An example of this would be a - doughnut shape. The outermost perimeter would be one part, and the hole cut out of the center making up the innermost - perimeter would be the second part. The outermost perimeter would be specified by a series of points arranged in clockwise - order, meaning that this part will be filled. The innermost perimeter would be specified by a series of points arranged in - counter-clockwise order, meaning that this part will not be filled. - + - Calculates the perimeter of shape. Is applicable for polygon shapes only. + Gets or sets the type of the point symbols. - The length will always be returned in current map units. - No corrections are made to take into account the curved shape of the Earth. - \new48 Added in version 4.8 + The possible values include predefined symbols, text characters and pictures. - + - Gets or sets the type of the shape. + Saves the state of the class to the string - The shape's type must match the type of the shapefile the shape is to be added to - except for shapes of type SHP_NULLSHAPE. + A string with the state or an empty string on failure. - + - Gets the number of points contained in the shape. + Sets a predefined combination of properties to set the commonly used symbols. - There is a confusion with name casing for this property. - It's actually spelled 'get_NumPoints' in the source code. - However because of the known bug in PIA generation process the property - ended up spelled 'get_numPoints' in earlier version of PIAs. After some hesitation we decided to keep it that way. - See description of the bug here: http://stackoverflow.com/questions/3179676/c-exposed-property-for-com-in-idl-is-showing-as-lower-case-all-of-a-sudden + This method changes PointType, PointShape, PointSidesCount, PointRotation and PointSidesRatio properties. + The predefined symbol to be set. - + - Gets "flattened" shape type, i.e. Z and M components will be ignored. + Provides a convenient way to set colors of the gradient fill. - \new493 Added in version 4.9.3 + The central color of the gradient. + The range of colors of each channel the gradient covers. + The values should be within 0-255. - + - Returns true if the shape doesn't have any points. + Gets or sets a string associated with the instance of class. Can store any information provided by developer. - \new493 Added in version 4.9.3 - - + - Creates a new instance of ShapeDrawingOptions class by copying all the properties. + Gets or set the value which indicates whether line pattern will be used to render polyline shapefile. - The reference to the new instance of the ShapeDrawingOptions class or NULL reference on failure. + This property won't be set to true unless line pattern with at least one line exists. - + - Restores the state of object from the string. + Gets or sets the color of vertices for the shapes. - A string generated by ShapeDrawingOptions.Serialize() method. + \see VerticesVisible - + - Draws a line using the stored options on specified device context. + Gets or sets the value which indicates whether the fill for shape vertices will be drawn. - The method can be used to draw map legend. - The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the drawing. - The height of the drawing. - A value which indicates whether or not vertices of the line will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. + \see VerticesVisible - + - Draws a line using the stored options on the specified device context. + Gets or sets the size of the shapes's vertices - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the drawing. - The height of the drawing. - A value which indicates whether or not vertices of the line will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. - + - Draws a point symbol using the stored options on the specified device context. + Gets or sets the type of shape vertices. - The method can be used to draw map legend. - The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. - + - Draws a point symbol using the stored options on the specified device context. + Gets or sets the value which indicates whether vertices of the shape will be visible. The default values is false. - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. + The visibility of point symbols for point shapefiles is not affected by this property. - + - Draws a rectangle using the stored options on the specified device context. + Gets or sets the values which indicates whether shapes will be visible. - The method can be used to draw map legend. - The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the drawing. - The height of the drawing. - A value which indicates whether or not vertices of the rectangle will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. - + - Draws a rectangle using the stored options on the specified device context. + Gets the text description of the specified error code. - The method can be used to draw map legend. - The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - The width of the drawing. - The height of the drawing. - A value which indicates whether or not vertices of the rectangle will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. + The numeric error code retrieved by ShapeDrawingOptions.LastErrorCode property. + The description of the error. - + - Draws a shape using the stored options on the specified device context. + Gets or sets a value indicating whether hot spot of icons should be position at the bottom center. + When set to false the hotspot will be at the center of icon. - The method can be used to draw map legend. - The handle of the device context. Can be obtained with .NET Graphics.GetHDC() method. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - A shape to draw. Point, polyline and polygon shapes are supported. - A value which indicates whether or not vertices of the line will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. + \new491 Added in version 4.9.1 - + - Draws a shape using the stored options on the specified device context. + Gets or sets type of frame to be displayed around point when ShapeDrawingOptions.PointShape is set to ptSymbolFontCharacter. - The method can be used to draw map legend. - The handle of the device context. - The x coordinate of the upper left corner of the drawing. - The y coordinate of the upper left corner of the drawing. - A shape to draw. Point, polyline and polygon shapes are supported. - A value which indicates whether or not vertices of the line will be drawn. - The width of the clipping rectangle. - The height of the clipping rectangle. - The back color of the device context the drawing is performed at. - The value should be specified to ensure correct blending when semi-transparent colors are used. - True on success and false otherwise. + \new491 Added in version 4.9.1 - + - Saves the state of the class to the string + Gets or sets a value indicating whether a frame will be drawn around point when ShapeDrawingOptions.PointShape is set to ptSymbolFontCharacter. - A string with the state or an empty string on failure. + \new491 Added in version 4.9.1 - + - Sets a predefined combination of properties to set the commonly used symbols. + Gets or sets a value indicating whether the category will be displayed only + for scale range specified by MinVisibleScale and MaxVisibleScale properties - This method changes PointType, PointShape, PointSidesCount, PointRotation and PointSidesRatio properties. - The predefined symbol to be set. + \new493 Added in version 4.9.3 - + - Provides a convenient way to set colors of the gradient fill. + Gets or sets maximum map scale at which the category is visible + when ShapeDrawingOptions.DynamicVisibility is set to true. - The central color of the gradient. - The range of colors of each channel the gradient covers. - The values should be within 0-255. + \new493 Added in version 4.9.3 - + - Gets the text description of the specified error code. + Gets or sets minimum map scale at which the category is visible + when ShapeDrawingOptions.DynamicVisibility is set to true. - The numeric error code retrieved by ShapeDrawingOptions.LastErrorCode property. - The description of the error. + \new493 Added in version 4.9.3 - + - The graphical mode to be used to render symbology. + Represents a list of visualization categories which determine the appearance of the shapefile. + + Provides methods for: + - managing categories: ShapefileCategories.Add, ShapefileCategories.Insert(), ShapefileCategories.Remove, ShapefileCategories.Clear(); + - generation of categories based on the specified attribute: ShapefileCategories.Generate(); + - mapping of categories to particular shapes: ShapefileCategories.ApplyExpressions(); + - setting of common color scheme for the range of categories: ShapefileCategories.ApplyColorScheme(). + - accessing particular categories: ShapefileCategories.get_Item(). + + Here is a diagram for the ShapefileCategories class. + \dot + digraph shapefilecategories_diagram { + nodesep = 0.3; + ranksep = 0.3; + splines = ortho; + + node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; + cat [ label="ShapefileCategory" URL="\ref ShapefileCategory"]; + + node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; + lst [ label="ShapefileCategories" URL="\ref ShapefileCategories"]; + sdo [ label="ShapeDrawingOptions" URL="\ref ShapeDrawingOptions"]; + + node [style = dashed, color = gray]; + sf [ label="Shapefile" URL="\ref Shapefile"]; + + edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + cat -> sdo [ URL="\ref ShapefileCategory.DrawingOptions", tooltip = "ShapefileCategory.DrawingOptions", headlabel = " 1"]; + lst -> cat [ URL="\ref ShapefileCategories.get_Item()", tooltip = "ShapefileCategories.get_Item()", headlabel = " n"]; + sf -> lst [ URL="\ref Shapefile.Categories", tooltip = "Shapefile.Categories", headlabel = " 1"]; + } + + \enddot + Graph description + \new48 Added in version 4.8 - + - Gets or sets the background color of the polygon fill. + Creates a new visualization category, adds it to the list and returns its reference to the caller. - It is used for polygon shapes when hatch fill is chosen. - \see FillType + It's the responsibility of the developer to map the new category to the + particular shape by either: + - specifying ShapefileCategory.Expression and calling ShapefileCategories.ApplyExpression(); + - by using Shapefile.set_ShapeCategory() property; + . + The name of the new category. It must not be unique. + The reference to the newly created category or NULL reference on failure. - + - Gets or sets the value which indicates whether a background will be drawn when ShapeDrawingOptions.FillType is set to ftHatch. + Creates the specified number of visualization categories and expressions for them. + The method can be useful to override generation routine provided in ShapefileCategories.GenerateCategories() + which always generate categories covering the full range of values of the specified field. This method can + define the range of values explicitly, therefore certain values can be excluded from classification or on contrary + categories can be added for the values which aren't yet present in the table. + The index of the field to build classification by. + The type of the classification. + The number of categories to add. If ClassificationType equals ctUniqueValues this value will be skipped. + The minimal value of the field to include in the classification. + Th maximum value of the field to include in the classification. + True on successful adding and false otherwise. - + - Gets or sets the fill color of the shape. + Applies color scheme to the visualization categories. - The color is used for point and polygon shapes when ShapeDrawingOptions.FillType is equal to ftSimple or ftHatch, - or the gradient starting color is ShapeDrawingOptions.FillType is equal to ftGradient. + The method of interpolation. + Color scheme to take colors from. - + - Gets or sets the end color of the gradient fill. + Applies color scheme to the visualization categories. - It is used when ShapeDrawingOptions.FillType is equal to ftGradient. + The method of interpolation. + The color scheme to take colors from. + The element of the shape symbology to apply colors to. - + - Gets or sets the the value which defines the bounds of the gradient fill. + Applies color scheme to the visualization categories. + The method of interpolation. + The color scheme to take colors from. + The element of the shape symbology to apply colors to. + The index of the first category to apply colors to. + The index of the last category to apply colors to. - + - The type of the gradient to draw polygon fill of the point symbols and polygon shapes. + Maps particular shapes to the category based on ShapefileCategory.Expression. - \see FillType, FillColor, FillColor2. + The mapping between the category and shapes can be changed by Shapefile.set_ShapeCategory property. + The index of the category. - + - The hatch style of the fill for point symbols and polygon shapes. + Maps shapes to the visualization categories based in ShapefileCategory.Expression. - \see FillType, FillBgColor, FillBgTransparent. + The mapping between the category and shapes can be changed by Shapefile.set_ShapeCategory property. - + - Gets or sets the angle of rotation of the polygon fill in degrees. + The name of the classification scheme to display in the legend. - Affects the rotation of gradient and texture fill. - \see FillType - + - Gets or sets the transparency of the fill. Ranges from 0 (transparent) to 255 (opaque). + Removes all the categories from the list. - + - The type of the polygon fill. See the enumeration for details. + Returns the number of the categories in the list. - + - Gets or sets the value which indicates whether the fill is visible. + Restores the state of the object from the string. - Affects the drawing of point symbols and polygon shapes. + A string generated by ShapefileCategories.Serialize() method. - + - The name of the font to use for drawing point symbols when ShapeDrawingOptions.PointType is equal to pstCharacter. + Generates visualization categories by certain attribute + The index of the field to generate categories by. + The type of classification. + Number of classes to generate. The parameter is omitted + in case unique values classification is used. + True on successful generation and false otherwise. - + - Retrieves the numeric code of the last error that took place in the instance class. + Gets or sets the callback object which is used to return to the client the information about progress and errors. - The usage of this property clears the error code. + An instance of the class which implements ICallback interface should be passed. + The class must be implemented by caller. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Gets or sets the line color of the shapes. + Creates a new visualization category and inserts it at specified position of the list. - Affects the drawing of all shape types. + The index to insert category at. + The name of the new category. + Reference to the new category or NULL reference on failure. - + - Gets or sets line pattern for rendering polyline shapefile. + A text string associated with the instance of the class. Any value can be stored by developer in this property. - + - Gets or sets the line style of the shapes. + Inserts a category at the specified index in the collection. - Affects the drawing of all shape types. + The index. + The category to be inserted. + True on success. + \new494 Added in version 4.9.4 - + - Gets or sets the transparency of lines. Ranges from 0 (transparent) to 255 (opaque). + Retrieves the numeric code of the last error that took place in the class. + The usage of this property clears the error code. - + - Gets or sets the value which indicates whether lines will be visible while drawing shapes. + Moves the specified category down the list by swapping it with the succeeding category. - This affects drawing of polylines, as well as the drawing of outline of points symbols and polygons. + The index of the category to move down. + True on success and false otherwise. - + - Gets or sets the width of the lines to draw shapes. + Moves the specified category up the list by swapping it with the preceding category. + The index of the category to move. + True on success and false otherwise. - + - Gets or sets the picture which will be used as texture brush (ShapeDrawingOptions.FillType = ftPicture) - or point symbol (ShapeDrawingOptions.PointType = ptSymbolPicture). + Removes the specified category. - The property affects the drawing of point symbols and polygons. + The index of the category to remove. + True on success and false otherwise. - + - Gets or sets the coefficient for scaling picture horizontally. + Saves the state of the object to the string. + A string with serialized state. - + - Gets or sets the coefficient for scaling picture vertically. + A reference to the parent shapefile. + NULL reference will be returned in case the categories aren't associated with a shapefile. - + - Get or sets the ANSI code of the text character to use as point symbol. + Gets the description of the specific error code. + The error code returned by ShapefileCategories.LastErrorCode + The string with the description - + - Gets or sets the rotation of the point symbol in degrees. + Returns the category with the specified index. + The index of the category to retrieve. + The reference to the category or NULL reference on failure. - + - Gets or sets the predefined shape for the point symbol. + Replaces the category with the specified index with the new one. - It is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. + The index of the category to replace. + The new category. - + - Gets or sets the number of sides for some of the predefined symbols such as regular, star or cross. - - This value is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. - - - - Gets or sets the side ratio for some of the predefined point symbols such as regular, star and cross. - - This value is used when ShapeDrawingOptions.PointType is equal to ptSymbolStandard. - - - - Gets or sets the size of the point symbol including predefined symbols, characters and pictures. - - - - - Gets or sets the type of the point symbols. - - The possible values include predefined symbols, text characters and pictures. - - - - Gets or sets a string associated with the instance of class. Can store any information provided by developer. - - - - - Gets or set the value which indicates whether line pattern will be used to render polyline shapefile. - - This property won't be set to true unless line pattern with at least one line exists. - - - - Gets or sets the color of vertices for the shapes. - - \see VerticesVisible - - - - Gets or sets the value which indicates whether the fill for shape vertices will be drawn. - - \see VerticesVisible - - - - Gets or sets the size of the shapes's vertices - - - - - Gets or sets the type of shape vertices. - - - - - Gets or sets the value which indicates whether vertices of the shape will be visible. The default values is false. - - The visibility of point symbols for point shapefiles is not affected by this property. - - - - Gets or sets the values which indicates whether shapes will be visible. - - - - - Gets or sets a value indicating whether hot spot of icons should be position at the bottom center. - When set to false the hotspot will be at the center of icon. + Gets index of the specified category within a collection. + Category to find index for. + Index of category. \new491 Added in version 4.9.1 - + - Gets or sets type of frame to be displayed around point when ShapeDrawingOptions.PointShape is set to ptSymbolFontCharacter. + Gets index of category by its name. The comparison is case-sensitive. + Category name to find index for. + Index of category. \new491 Added in version 4.9.1 - + - Gets or sets a value indicating whether a frame will be drawn around point when ShapeDrawingOptions.PointShape is set to ptSymbolFontCharacter. + Applies specific coloring to polygon layer based on 2 rules: + - each polygon fill color must be different from the colors of all adjacent polygons; + - the minimum overall number of colors must be used. - \new491 Added in version 4.9.1 + Color scheme to take colors from. If the number of color breaks + is smaller than the number of polygon colors, interpolation with ColorScheme.GetGraduatedColor + method will be used. + The coloring assumptions used by the method correspond to the formulation of + Four color theorem. But simple greedy + algorithm used by the method usually employs somewhat more colors (5-6), + although provides much better performance than precise implementations. + + True on success. + \new492 Added in version 4.9.2 - + - Gets or sets a value indicating whether the category will be displayed only - for scale range specified by MinVisibleScale and MaxVisibleScale properties + Generates categories based on specified field. - \new493 Added in version 4.9.3 + Name of the field. + Type of the classification. + The number classes. + True on success. + \new494 Added in version 4.9.4 - + - Gets or sets maximum map scale at which the category is visible - when ShapeDrawingOptions.DynamicVisibility is set to true. + Adds the category to the collection. - \new493 Added in version 4.9.3 + The category. + \new494 Added in version 4.9.4 - + - Gets or sets minimum map scale at which the category is visible - when ShapeDrawingOptions.DynamicVisibility is set to true. + Gets or sets the index of classification that was used to generate categories. \new493 Added in version 4.9.3 - + - Represents a list of visualization categories which determine the appearance of the shapefile. + Represents a set of visualization options for shapefile layer. - Provides methods for: - - managing categories: ShapefileCategories.Add, ShapefileCategories.Insert(), ShapefileCategories.Remove, ShapefileCategories.Clear(); - - generation of categories based on the specified attribute: ShapefileCategories.Generate(); - - mapping of categories to particular shapes: ShapefileCategories.ApplyExpressions(); - - setting of common color scheme for the range of categories: ShapefileCategories.ApplyColorScheme(). - - accessing particular categories: ShapefileCategories.get_Item(). + The set of options is represented by instance of ShapeDrawingOptions class which can be accessed by ShapefileCategory.DrawingOptions, + while ShapefileCategory.Expression is used for mapping this options to particular shapes. - Here is a diagram for the ShapefileCategories class. + Here is a diagram for the ShapefileCategory class. \dot - digraph shapefilecategories_diagram { + digraph shapefilecategory_diagram { nodesep = 0.3; ranksep = 0.3; splines = ortho; @@ -8385,539 +8893,302 @@ cat [ label="ShapefileCategory" URL="\ref ShapefileCategory"]; node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; - lst [ label="ShapefileCategories" URL="\ref ShapefileCategories"]; sdo [ label="ShapeDrawingOptions" URL="\ref ShapeDrawingOptions"]; node [style = dashed, color = gray]; - sf [ label="Shapefile" URL="\ref Shapefile"]; + lst [ label="ShapefileCategories" URL="\ref ShapefileCategories"]; - edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] + edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] cat -> sdo [ URL="\ref ShapefileCategory.DrawingOptions", tooltip = "ShapefileCategory.DrawingOptions", headlabel = " 1"]; lst -> cat [ URL="\ref ShapefileCategories.get_Item()", tooltip = "ShapefileCategories.get_Item()", headlabel = " n"]; - sf -> lst [ URL="\ref Shapefile.Categories", tooltip = "Shapefile.Categories", headlabel = " 1"]; } - \enddot Graph description \new48 Added in version 4.8 - + - Creates a new visualization category, adds it to the list and returns its reference to the caller. + Gets or sets visualization options associated with the category. - It's the responsibility of the developer to map the new category to the - particular shape by either: - - specifying ShapefileCategory.Expression and calling ShapefileCategories.ApplyExpression(); - - by using Shapefile.set_ShapeCategory() property; - . - The name of the new category. It must not be unique. - The reference to the newly created category or NULL reference on failure. - + - Creates the specified number of visualization categories and expressions for them. + Gets or sets expression which defines shapes which belong to the category. - The method can be useful to override generation routine provided in ShapefileCategories.GenerateCategories() - which always generate categories covering the full range of values of the specified field. This method can - define the range of values explicitly, therefore certain values can be excluded from classification or on contrary - categories can be added for the values which aren't yet present in the table. - The index of the field to build classification by. - The type of the classification. - The number of categories to add. If ClassificationType equals ctUniqueValues this value will be skipped. - The minimal value of the field to include in the classification. - Th maximum value of the field to include in the classification. - True on successful adding and false otherwise. - + - Applies color scheme to the visualization categories. + Gets or sets the name of the category. The names must not be unique. - The method of interpolation. - Color scheme to take colors from. - + - Applies color scheme to the visualization categories. + Gets or sets maximum value of the value range the category covers. - The method of interpolation. - The color scheme to take colors from. - The element of the shape symbology to apply colors to. + The value is used when cvRange is set as ShapefileCategory.ValueType. + \new493 Added in version 4.9.3 - + - Applies color scheme to the visualization categories. + Gets or sets minimum value of the value range the category covers. - The method of interpolation. - The color scheme to take colors from. - The element of the shape symbology to apply colors to. - The index of the first category to apply colors to. - The index of the last category to apply colors to. + The value is used when either cvSingleValue, cvRange + is set for ShapefileCategory.ValueType. + \new493 Added in version 4.9.3 - + - Maps particular shapes to the category based on ShapefileCategory.Expression. + Gets or sets value type for the category. - The mapping between the category and shapes can be changed by Shapefile.set_ShapeCategory property. - The index of the category. + Depending on value type either ShapefileCategory.MinValue/ShapefileCategory.MaxValue properties + or ShapefileCategory.Expression are used in the calculation process. ShapefileCategories.Generate + method will set cvSingleValue for unique values classification and ctRange for any + interval classification. These values are faster to apply. However manual setting of + ShapefileCategory.Expression property will change it to cvExpression. + \new493 Added in version 4.9.3 - + - Maps shapes to the visualization categories based in ShapefileCategory.Expression. + Defines a part of shapefile color scheme and specifies how a certain region of a shapefile will be colored. - The mapping between the category and shapes can be changed by Shapefile.set_ShapeCategory property. + \deprecated in v. 4.8. Use ShapefileCategories, ShapefileCategory, ColorScheme classes instead. + \removed493 Removed in 4.9.3 - + - Removes all the categories from the list. + Gets or sets the caption of the shapefile color break. - + - Restores the state of the object from the string. + Gets or sets the color which will be used for drawing objects characterized by ShapefileColorBreak.EndValue. - A string generated by ShapefileCategories.Serialize() method. - + - Generates visualization categories by certain attribute + Gets or sets the value which represent the end of shapefile color break. - The index of the field to generate categories by. - The type of classification. - Number of classes to generate. The parameter is omitted - in case unique values classification is used. - True on successful generation and false otherwise. - + - Creates a new visualization category and inserts it at specified position of the list. + Gets or sets the color which will be used for drawing objects characterized by ShapefileColorBreak.StartValue. - The index to insert category at. - The name of the new category. - Reference to the new category or NULL reference on failure. - + - Inserts a category at the specified index in the collection. + Gets or sets the value which represent the start of shapefile color break. - The index. - The category to be inserted. - True on success. - \new494 Added in version 4.9.4 - + - Moves the specified category down the list by swapping it with the succeeding category. + Gets or sets a boolean value which indicates whether the objects defined by color break will be displayed. - The index of the category to move down. - True on success and false otherwise. - + - Moves the specified category up the list by swapping it with the preceding category. + A shapefile color scheme defines how a shapefile will be colored. - The index of the category to move. - True on success and false otherwise. + A shapefile color scheme consists of ShapefileColorBreak objects. + \deprecated in v. 4.8. Use ShapefileCategories, ShapefileCategory, ColorScheme instead. + \removed493 Removed in 4.9.3 - + - Removes the specified category. + Adds a color break to the color scheme. - The index of the category to remove. - True on success and false otherwise. + + - + - Saves the state of the object to the string. + Gets or sets the index in the attribute table the color scheme is associated with. - A string with serialized state. - + - Gets the description of the specific error code. + Gets or sets callback object to return the information about the errors. - The error code returned by ShapefileCategories.LastErrorCode - The string with the description + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - + - Returns the category with the specified index. + Insert a color break in the specified position of the scheme. - The index of the category to retrieve. - The reference to the category or NULL reference on failure. + The position to insert color break at. + The color break to insert. + The actual position color break was inserted at. - + - Replaces the category with the specified index with the new one. + Gets or sets text string associated with the object. - The index of the category to replace. - The new category. - + - Gets index of the specified category within a collection. + Returns the code of the last error which took place inside this instance of class. - Category to find index for. - Index of category. - \new491 Added in version 4.9.1 - + - Gets index of category by its name. The comparison is case-sensitive. + Gets or sets the layer handle the color scheme is associated with. - Category name to find index for. - Index of category. - \new491 Added in version 4.9.1 - + - Applies specific coloring to polygon layer based on 2 rules: - - each polygon fill color must be different from the colors of all adjacent polygons; - - the minimum overall number of colors must be used. + Gets the number of color breaks in the color scheme. - Color scheme to take colors from. If the number of color breaks - is smaller than the number of polygon colors, interpolation with ColorScheme.GetGraduatedColor - method will be used. - The coloring assumptions used by the method correspond to the formulation of - Four color theorem. But simple greedy - algorithm used by the method usually employs somewhat more colors (5-6), - although provides much better performance than precise implementations. - - True on success. - \new492 Added in version 4.9.2 + The number of breaks. - + - Generates categories based on specified field. + Removes specific color break from the scheme. - Name of the field. - Type of the classification. - The number classes. - True on success. - \new494 Added in version 4.9.4 + The index of the break to remove. - + - Adds the category to the collection. + Gets a color break from the color scheme. - The category. - \new494 Added in version 4.9.4 + The index of the break. + The color break object or NULL reference on failure. - + - The name of the classification scheme to display in the legend. + Gets the description of the error code returned by ShapefileColorScheme.LastErrorCode. + The code of error. + The description of error. - + - Returns the number of the categories in the list. + Replaces a color break in the color scheme. + The index of color break to replace. + The reference to the new color break. - + - Gets or sets the callback object which is used to return to the client the information about progress and errors. + Represents a network built from the polyline shapefile. - An instance of the class which implements ICallback interface should be passed. - The class must be implemented by caller. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + A shape network is created from the shapes in a polyline shapefile which allows you to traverse the shapefile simulating + water flowing in a watershed to a single outlet. To create a shape network from a polyline shapefile, first choose an outlet + shape from the shapes in the shapefile. Next, choose an outlet point within the specified outlet shape. Finally, you need to + select a tolerance value. The tolerance is used to determine whether to include a shape in the shape network if it is not + connected to the network. Using this starting criteria, a shape network can be created from the polyline shapefile. + - + - A text string associated with the instance of the class. Any value can be stored by developer in this property. + Builds a shape network from the specified line shapefile using the shape index to determine which shape in the shapefile is + to be used as the outlet shape. + The shapefile to be used to create the shape network. + The index of the shape in the specified shapefile to be used as the outlet shape for the shape network + The point index of the point in the specified outlet shape to be used as the outlet point for the shape network. + The tolerance used to find disconnected segments to merge into the network. + The ambiguity resolution method used to resolve any ambiguity while building the shape network. + Distance to outlet is the only ambiguity resolution method implemented. + Optional. The ICallback object which will receive progress and error messages during the + creation of the shape network. + The success or failure of building the shape network. If a non-zero integer is returned, the + shape network build was successful. If a zero is returned, the shape network build was not + successful. - + - Retrieves the numeric code of the last error that took place in the class. + Closes the shape network. - The usage of this property clears the error code. + A boolean value representing the success or failure of closing the shape network. - + - A reference to the parent shapefile. + Gets the current shape object in the shape network. - NULL reference will be returned in case the categories aren't associated with a shapefile. - + - Gets or sets the index of classification that was used to generate categories. + Gets the index of the current shape in the shape network. - \new493 Added in version 4.9.3 - + - Represents a set of visualization options for shapefile layer. + Deletes a shape from the shape network. - - The set of options is represented by instance of ShapeDrawingOptions class which can be accessed by ShapefileCategory.DrawingOptions, - while ShapefileCategory.Expression is used for mapping this options to particular shapes. - - Here is a diagram for the ShapefileCategory class. - \dot - digraph shapefilecategory_diagram { - nodesep = 0.3; - ranksep = 0.3; - splines = ortho; - - node [shape= "polygon", peripheries = 3, fontname=Helvetica, fontsize=9, color = gray, style = filled, height = 0.2, width = 0.8]; - cat [ label="ShapefileCategory" URL="\ref ShapefileCategory"]; - - node [color = tan, peripheries = 1, height = 0.3, width = 1.0]; - sdo [ label="ShapeDrawingOptions" URL="\ref ShapeDrawingOptions"]; - - node [style = dashed, color = gray]; - lst [ label="ShapefileCategories" URL="\ref ShapefileCategories"]; - - edge [ dir = none, style = solid, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060", labeldistance = 0.6 ] - cat -> sdo [ URL="\ref ShapefileCategory.DrawingOptions", tooltip = "ShapefileCategory.DrawingOptions", headlabel = " 1"]; - lst -> cat [ URL="\ref ShapefileCategories.get_Item()", tooltip = "ShapefileCategories.get_Item()", headlabel = " n"]; - } - \enddot - Graph description - \new48 Added in version 4.8 + The index of the shape to be deleted from the shape network. + A boolean value representing the success or failure of deleting the shape from the shape network. - + - Gets or sets visualization options associated with the category. + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - + - Gets or sets expression which defines shapes which belong to the category. + The key may be used by the programmer to store any string data associated with the object. - + - Gets or sets the name of the category. The names must not be unique. + Retrieves the last error generated in the object. - + - Gets or sets maximum value of the value range the category covers. + Moves the current shape pointer down the network by one link. - The value is used when cvRange is set as ShapefileCategory.ValueType. - \new493 Added in version 4.9.3 + A boolean value representing the success or failure of moving the current shape pointer down the + shape network by one link. - + - Gets or sets minimum value of the value range the category covers. + Moves the current shape pointer to the shape specified by the shape index. - The value is used when either cvSingleValue, cvRange - is set for ShapefileCategory.ValueType. - \new493 Added in version 4.9.3 + The shape index of the shape in the network to move the current shape pointer to. + A boolean value representing the success or failure of moving the current shape pointer to the + specified shape. - + - Gets or sets value type for the category. + Moves the current shape pointer to the outlet shape in the shape network. - Depending on value type either ShapefileCategory.MinValue/ShapefileCategory.MaxValue properties - or ShapefileCategory.Expression are used in the calculation process. ShapefileCategories.Generate - method will set cvSingleValue for unique values classification and ctRange for any - interval classification. These values are faster to apply. However manual setting of - ShapefileCategory.Expression property will change it to cvExpression. - \new493 Added in version 4.9.3 + A boolean value representing the success or failure of moving the current shape pointer to the + outlet shape in the shape network. - + - Defines a part of shapefile color scheme and specifies how a certain region of a shapefile will be colored. + Moves the current shape pointer up the shape network, taking the specified path. - \deprecated in v. 4.8. Use ShapefileCategories, ShapefileCategory, ColorScheme classes instead. - \removed493 Removed in 4.9.3 + The index of the shape in the shape network to use as the upstream path. This is necessary + because a node may have more than one upstream path. + A boolean value representing the success or failure of moving the current shape pointer up in the + shape network. - + - Gets or sets the caption of the shapefile color break. + Gets the number of shapes in the shape network. - + - Gets or sets the color which will be used for drawing objects characterized by ShapefileColorBreak.EndValue. + Gets the number of upstream shapes in the network before the next fork. - + - Gets or sets the value which represent the end of shapefile color break. + Opens a shape network. + The shapefile object to open as a shape network. + Optional. ICallback object which will receive progress and error messages while the shape network is opened. + A boolean value representing the success or failure of opening the shape network - + - Gets or sets the color which will be used for drawing objects characterized by ShapefileColorBreak.StartValue. + Gets the index of the parent of the current shape. If the current shape is the outlet shape in the shape network, -1 will be returned. - + - Gets or sets the value which represent the start of shapefile color break. - - - - - Gets or sets a boolean value which indicates whether the objects defined by color break will be displayed. - - - - - A shapefile color scheme defines how a shapefile will be colored. - - A shapefile color scheme consists of ShapefileColorBreak objects. - \deprecated in v. 4.8. Use ShapefileCategories, ShapefileCategory, ColorScheme instead. - \removed493 Removed in 4.9.3 - - - - Adds a color break to the color scheme. - - - - - - - Insert a color break in the specified position of the scheme. - - The position to insert color break at. - The color break to insert. - The actual position color break was inserted at. - - - - Gets the number of color breaks in the color scheme. - - The number of breaks. - - - - Removes specific color break from the scheme. - - The index of the break to remove. - - - - Gets a color break from the color scheme. - - The index of the break. - The color break object or NULL reference on failure. - - - - Gets the description of the error code returned by ShapefileColorScheme.LastErrorCode. - - The code of error. - The description of error. - - - - Replaces a color break in the color scheme. - - The index of color break to replace. - The reference to the new color break. - - - - Gets or sets the index in the attribute table the color scheme is associated with. - - - - - Gets or sets callback object to return the information about the errors. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Gets or sets text string associated with the object. - - - - - Returns the code of the last error which took place inside this instance of class. - - - - - Gets or sets the layer handle the color scheme is associated with. - - - - - Represents a network built from the polyline shapefile. - - A shape network is created from the shapes in a polyline shapefile which allows you to traverse the shapefile simulating - water flowing in a watershed to a single outlet. To create a shape network from a polyline shapefile, first choose an outlet - shape from the shapes in the shapefile. Next, choose an outlet point within the specified outlet shape. Finally, you need to - select a tolerance value. The tolerance is used to determine whether to include a shape in the shape network if it is not - connected to the network. Using this starting criteria, a shape network can be created from the polyline shapefile. - - - - - Builds a shape network from the specified line shapefile using the shape index to determine which shape in the shapefile is - to be used as the outlet shape. - - The shapefile to be used to create the shape network. - The index of the shape in the specified shapefile to be used as the outlet shape for the shape network - The point index of the point in the specified outlet shape to be used as the outlet point for the shape network. - The tolerance used to find disconnected segments to merge into the network. - The ambiguity resolution method used to resolve any ambiguity while building the shape network. - Distance to outlet is the only ambiguity resolution method implemented. - Optional. The ICallback object which will receive progress and error messages during the - creation of the shape network. - The success or failure of building the shape network. If a non-zero integer is returned, the - shape network build was successful. If a zero is returned, the shape network build was not - successful. - - - - Closes the shape network. - - A boolean value representing the success or failure of closing the shape network. - - - - Deletes a shape from the shape network. - - The index of the shape to be deleted from the shape network. - A boolean value representing the success or failure of deleting the shape from the shape network. - - - - Moves the current shape pointer down the network by one link. - - A boolean value representing the success or failure of moving the current shape pointer down the - shape network by one link. - - - - Moves the current shape pointer to the shape specified by the shape index. - - The shape index of the shape in the network to move the current shape pointer to. - A boolean value representing the success or failure of moving the current shape pointer to the - specified shape. - - - - Moves the current shape pointer to the outlet shape in the shape network. - - A boolean value representing the success or failure of moving the current shape pointer to the - outlet shape in the shape network. - - - - Moves the current shape pointer up the shape network, taking the specified path. - - The index of the shape in the shape network to use as the upstream path. This is necessary - because a node may have more than one upstream path. - A boolean value representing the success or failure of moving the current shape pointer up in the - shape network. - - - - Opens a shape network. - - The shapefile object to open as a shape network. - Optional. ICallback object which will receive progress and error messages while the shape network is opened. - A boolean value representing the success or failure of opening the shape network - - - - Rasterizes the network into a D8 grid. + Rasterizes the network into a D8 grid. A boolean value representing whether the shape network bounds will be used as the only bounds for the D8 grid or not. @@ -8926,6 +9197,11 @@ Optional. The ICallback object which will receive progress and error messages when the grid is being created. Optional. The rasterized Grid representing the shape network. + + + Gets the shapefile used to create the network. + + Gets the shape index of an ambiguous shape in the shape network. @@ -8952,51 +9228,6 @@ The error code for which the error message is required. The error message description for the specified error code. - - - Gets the current shape object in the shape network. - - - - - Gets the index of the current shape in the shape network. - - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - - - - The key may be used by the programmer to store any string data associated with the object. - - - - - Retrieves the last error generated in the object. - - - - - Gets the number of shapes in the shape network. - - - - - Gets the number of upstream shapes in the network before the next fork. - - - - - Gets the index of the parent of the current shape. If the current shape is the outlet shape in the shape network, -1 will be returned. - - - - - Gets the shapefile used to create the network. - - @@ -9009,6 +9240,11 @@ True on successful calculation and false otherwise. \new48 Added in version 4.8 + + + Returns the common dialog filter containing all supported file extensions in string format. + + Closes the attribute table. @@ -9087,6 +9323,37 @@ is being replced by the new field. A boolean value representing the success or failure of replacing the specified field. + + + Gets whether or not the table is in editing mode. + + + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + The key may be used by the programmer to store any string data associated with the object. + + + + + Retrieves the last error generated in the object. + + + + + Gets the number of fields in the table. + + + + + Gets the number of rows in the table. + + Opens a .dbf table from file. @@ -9251,7 +9518,13 @@ The methods may be used for in-memory, when the content should be saved without switching to disk mode. \new490 Added in version 4.9.0 - + + + Gets a value indicating whether the table has any joined tables. + + \new490 Added in version 4.9.0 + + Joins external table to the current one. @@ -9291,6 +9564,12 @@ Client can handle this event by populating joinSource table parameter using filename, fieldList and options parameters. \new490 Added in version 4.9.0 + + + Gets number of joins for the table. + + \new490 Added in version 4.9.0 + Serializes the state of joins for table to be restored later with Table.Deserialize method. @@ -9379,6 +9658,12 @@ The string with names. \new494 Added in version 4.9.4 + + + Gets the filename of the DBF file if the table is bound to one. + + \new494 Added in version 4.9.4 + Gets the options of the join operation. @@ -9395,60 +9680,6 @@ True if the row is modified. \new494 Added in version 4.9.4 - - - Returns the common dialog filter containing all supported file extensions in string format. - - - - - Gets whether or not the table is in editing mode. - - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - The key may be used by the programmer to store any string data associated with the object. - - - - - Retrieves the last error generated in the object. - - - - - Gets the number of fields in the table. - - - - - Gets the number of rows in the table. - - - - - Gets a value indicating whether the table has any joined tables. - - \new490 Added in version 4.9.0 - - - - Gets number of joins for the table. - - \new490 Added in version 4.9.0 - - - - Gets the filename of the DBF file if the table is bound to one. - - \new494 Added in version 4.9.4 - Holds the list of tile providers associated with %Tiles class. @@ -9463,7 +9694,7 @@ Arbitrary name of provider. Url pattern for provider. The pattern may include the following varying components: {zoom}, {x}, {y}, {switch:n1,n2,n3}. For example, the following can be used to setup OpenStreetMap - as custom provider: "http://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png". + as custom provider: "https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png". Projection used by tile server. Projection must not necessarily match the map projection. MapWinGIS will try to do the transformation even if projection don't match, though these may lead to distortions and gaps between tiles. @@ -9477,6 +9708,11 @@ True in case cached tiles, both from RAM and disk, for custom providers should be removed as well. + + + Gets the number of providers in the list. + + Removes specified custom provider from the list. @@ -9577,6 +9813,17 @@ Index of the provider in the list. URL pattern for custom providers and empty string for default ones. + + + Gets or sets a Callback object which handles progress and error messages. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + Gets the code of last error which took place inside this object. + + Gets the description of the specific error code. @@ -9620,22 +9867,6 @@ The p value. \new494 Added in version 4.9.4 - - - Gets the number of providers in the list. - - - - - Gets or sets a Callback object which handles progress and error messages. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - Gets the code of last error which took place inside this object. - - @@ -9665,12 +9896,25 @@ Minimal scale (zoom) to clear tiles for. Maximum scale (zoom) to clear tiles for. + + + Gets zoom (scale) of tiles currently displayed on the map. + + Tile zooms are discrete, but the scale for Map control is continuous. + Therefore in most cases tiles of particular zoom will be somewhat additionally scaled to fit the map, + i.e. their display size on map won't be equal to the original 256 pixels. + Restores the state of Tiles class from string. Serialized string generated by Tiles.Serialize method. + + + Gets or sets the filename of SQLite database to cache tiles into. + + Gets the bounds of specific tile in decimal degrees (for inner use/debug purposes). @@ -9691,6 +9935,23 @@ Extents object with tile bounds or null on failure. Can be used at the first step of prefetching operation. + + + Gets or sets a value indicating whether a grid should be drawn to displayes borders of tiles (for debug purposes). + + + + + Gets or sets the maximum zoom (scale) to be cached if the automatic caching is chosen. + + The setting won't affect tile prefetching. + + + + Gets or sets the minimum zoom (scale) to be cached if the automatic caching is chosen. + + The setting won't affect tile prefetching. + Caches tiles of the specified provider within specified geographic bounds @@ -9738,6 +9999,33 @@ to handle such extensions. The operation is executed asynchronously. See details in Tiles.Prefetch. + + + Gets or sets active provider to serve the tiles. + + The property will return ProviderCustom for custom provider and + won't be able to set a custom provider (use Tiles.ProviderId to do it). + + + + Gets or sets active provider to server the tiles. Ids of both default and custom providers can be specified. + + + + + Gets the name of the active provider. + + + + + Gets list of the available default and custom tile providers. + + + + + Gets proxy server settings for tiles class including IP and port, e.g. 192.168.0.1:80. + + Serializes the state of the Tiles class to be restored later with Tiles.Deserialize method. @@ -9752,6 +10040,25 @@ Port to be used. True on success and false otherwise. + + + Gets or sets the amount of time in milliseconds a worker thread will sleep before the next HTTP request. + + In some cases rapid caching of tiles can enact certain blocking logic for the IP address by server or one of the proxies. + \new491 Added in version 4.9.1 + + + + Gets or sets a value indicating whether server requests will be made to get the tiles. + + When set to false tiles will only be loaded from cache. + + + + Gets or sets a value indicating whether the tiles will be displayed on the map. + + When set to false tiles won't be requested either from server or cache. + Gets the current size of cache. @@ -9810,6 +10117,24 @@ The type of cache. True if the specific type of cache can be used. + + + Gets or sets a value indicating whether log will include all HTTP requests or only unsuccessful ones. + + \new491 Added in version 4.9.1 + + + + Gets filename to write log into. + + \new491 Added in version 4.9.1 + + + + Gets a value indicating whether logging of HTTP requests will be performed. + + \new491 Added in version 4.9.1 + Starts logging HTTP requests for tile server. @@ -9825,6 +10150,18 @@ \new491 Added in version 4.9.1 + + + Gets the number of unsuccessful HTTP requests during prefetching operation (Tiles.Prefetch and overloads). + + \new491 Added in version 4.9.1 + + + + Gets the total number of requests carried out during prefetching operation. + + \new491 Added in version 4.9.1 + Clears information about prefetching errors. @@ -9843,6 +10180,22 @@ Max Y index of tile. Number of tiles. + + + Gets or sets a Callback object which handles progress and error messages. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + A text string associated with object. Any value can be stored by developer in this property. + + + + + Gets the code of last error which took place inside this object. + + Gets the description of the specific error code. @@ -9850,6 +10203,31 @@ The error code returned by LastErrorCode property. String with the description. + + + Gets maximum available zoom level for the current provider. + + \new491 Added in version 4.9.1 + + + + Gets minimum available zoom level for the current provider. + + \new491 Added in version 4.9.1 + + + + Get information about whether map projection and tile projection match. + + This diagnostic value indicates whether tiles will be rendered without scaling and distortions and if they will be rendered at all. + \new491 Added in version 4.9.1 + + + + Gets projection used by specific tile service. + + \new491 Added in version 4.9.1 + Clears user name and password set by Tiles.SetProxyAuthorization method. @@ -9868,158 +10246,16 @@ True on success. \new493 Added in version 4.9.3 - + - Gets zoom (scale) of tiles currently displayed on the map. + Represents a triangulated irregular network which may be displayed in the map. - Tile zooms are discrete, but the scale for Map control is continuous. - Therefore in most cases tiles of particular zoom will be somewhat additionally scaled to fit the map, - i.e. their display size on map won't be equal to the original 256 pixels. - - - - Gets or sets the filename of SQLite database to cache tiles into. - - - - - Gets or sets a value indicating whether a grid should be drawn to displayes borders of tiles (for debug purposes). - - - - - Gets or sets the maximum zoom (scale) to be cached if the automatic caching is chosen. - - The setting won't affect tile prefetching. - - - - Gets or sets the minimum zoom (scale) to be cached if the automatic caching is chosen. - - The setting won't affect tile prefetching. - - - - Gets or sets active provider to serve the tiles. - - The property will return ProviderCustom for custom provider and - won't be able to set a custom provider (use Tiles.ProviderId to do it). - - - - Gets or sets active provider to server the tiles. Ids of both default and custom providers can be specified. - - - - - Gets the name of the active provider. - - - - - Gets list of the available default and custom tile providers. - - - - - Gets proxy server settings for tiles class including IP and port, e.g. 192.168.0.1:80. - - - - - Gets or sets the amount of time in milliseconds a worker thread will sleep before the next HTTP request. - - In some cases rapid caching of tiles can enact certain blocking logic for the IP address by server or one of the proxies. - \new491 Added in version 4.9.1 - - - - Gets or sets a value indicating whether server requests will be made to get the tiles. - - When set to false tiles will only be loaded from cache. - - - - Gets or sets a value indicating whether the tiles will be displayed on the map. - - When set to false tiles won't be requested either from server or cache. - - - - Gets or sets a value indicating whether log will include all HTTP requests or only unsuccessful ones. - - \new491 Added in version 4.9.1 - - - - Gets filename to write log into. - - \new491 Added in version 4.9.1 - - - - Gets a value indicating whether logging of HTTP requests will be performed. - - \new491 Added in version 4.9.1 - - - - Gets the number of unsuccessful HTTP requests during prefetching operation (Tiles.Prefetch and overloads). - - \new491 Added in version 4.9.1 - - - - Gets the total number of requests carried out during prefetching operation. - - \new491 Added in version 4.9.1 - - - - Gets or sets a Callback object which handles progress and error messages. - - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. - - - - A text string associated with object. Any value can be stored by developer in this property. - - - - - Gets the code of last error which took place inside this object. - - - - - Gets maximum available zoom level for the current provider. - - \new491 Added in version 4.9.1 - - - - Gets minimum available zoom level for the current provider. - - \new491 Added in version 4.9.1 - - - - Get information about whether map projection and tile projection match. - - This diagnostic value indicates whether tiles will be rendered without scaling and distortions and if they will be rendered at all. - \new491 Added in version 4.9.1 - - - - Gets projection used by specific tile service. - - \new491 Added in version 4.9.1 + A tin may be created from a grid, or opened from file. - + - Represents a triangulated irregular network which may be displayed in the map. + The string for common open dialog for filtering files which may be used as a source for TIN (*.tin). - A tin may be created from a grid, or opened from file. @@ -10050,6 +10286,21 @@ An array of Point type. True on success and false otherwise. + + + The filename associated with the object. + + + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + + + + The key may be used by the programmer to store any string data associated with the object. + + Gets the maximum x, y, and z values of the TIN's extents. @@ -10066,6 +10317,16 @@ Returns the minimum y value of the TIN's extents Returns the minimum Z value of the TIN's extents. + + + Returns the number of the triangles in the TIN. + + + + + Returns the number of the vertices in the TIN. + + Opens a TIN from the specified file. @@ -10137,36 +10398,6 @@ The index of the triangle to be tested whether or not it is a no-data triangle. A boolean value representing whether or not the triangle is a no-data triangle. - - - The string for common open dialog for filtering files which may be used as a source for TIN (*.tin). - - - - - The filename associated with the object. - - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. - - - - - The key may be used by the programmer to store any string data associated with the object. - - - - - Returns the number of the triangles in the TIN. - - - - - Returns the number of the vertices in the TIN. - - Holds list of actions performed by user with interactive editing tools to enable undo functionality. @@ -10207,27 +10438,6 @@ Returns number of operation in the batch. - - - Gets the description of the specific error code. - - The error code returned by LastErrorCode property. - String with the description. - - - - Reapplies a single operation in the list that was previously undone. - - If true, zooms to the subject shape in case it's outside the current map view. - True on success, i.e. there was at least one operation to redo. - - - - Reverts a single operation performed by user. - - If true, zooms to the subject shape in case it's outside the current map view. - True on success, i.e. there was at least one operation to undo - A text string associated with object. Any value can be stored by developer in this property. @@ -10254,6 +10464,27 @@ Number of operations performed by user that can be reverted with UndoList.Undo method. + + + Gets the description of the specific error code. + + The error code returned by LastErrorCode property. + String with the description. + + + + Reapplies a single operation in the list that was previously undone. + + If true, zooms to the subject shape in case it's outside the current map view. + True on success, i.e. there was at least one operation to redo. + + + + Reverts a single operation performed by user. + + If true, zooms to the subject shape in case it's outside the current map view. + True on success, i.e. there was at least one operation to undo + A utils object provides access to a set of utility functions to perform a variety of tasks on other objects such as grids, images, points, shapes, shapefiles, tins, etc. @@ -10292,6 +10523,12 @@ Altitude. Defaults to 45. + + + The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + Uses valid data in a grid to replace grid cells containing no-data values with an interpolated value. @@ -10346,11 +10583,21 @@ the grid is being converted to the shapefile. - + - Merges several images in a single image. + The key may be used by the programmer to store any string data associated with the object. - All the input images must be of the same size. + + + + Retrieves the last error generated in the object. + + + + + Merges several images in a single image. + + All the input images must be of the same size. The color marked in the input image as transparent won't be passed to the output. An array of string type with the filenames of the images. The name if te output file. @@ -10812,21 +11059,77 @@ True on success and false otherwise. \new493 Added in version 4.9.3 (is moved from AxMap.IsTiffGrid) - + - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. + Gets the tkUnitsOfMeasure enumeration associated with the specified EPSG Unit Code - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + EPSG-defined Unit of Measure constant + The internal enumeration associated with the specified EPSG code + + Supports the more common EPSG-defined Unit constants; specifically those that can be mapped to + the currently defined tkUnitsOfMeasure enumeration values. If the EPSG code cannot be mapped, + an Error will be submitted to the global callback with error code tkINVALID_PARAMETER_VALUE, + and return the default value of umDecimalDegrees. + + \new495 Added in version 4.9.5 - + - The key may be used by the programmer to store any string data associated with the object. + Gets the name of the projection associated with the specified NAD83 enumeration + + Value from the the NAD83 projection enumeration tkNad83Projection + + GDAL-provided projection name, or an empty string on error + + If an error occurs, either because an invalid ID is specified, or the projection string + could not be loaded, a descriptive error will be raised to the Callback function (if one is specified). + + \new495 Added in version 4.9.5 - + - Retrieves the last error generated in the object. + Gets the name of the projection associated with the specified WGS84 enumeration + + + Value from the the NAD83 projection enumeration tkNad83Projection + + GDAL-provided projection name, or an empty string on error + + If an error occurs, either because an invalid ID is specified, or the projection string + could not be loaded, a descriptive error will be raised to the Callback function (if one is specified). + + \new495 Added in version 4.9.5 + + + + Gets the name of the projected coordinate system associated with the specified SRID, + which include the NAD83 and WGS84 codes, as well as those not specified by the enumerations, + such as NAD27, NAD83 Harn, Beijing, Pulkova, etc. + + + Spatial Reference identifier, could refer to any valid Projected or Geographic coordinate system + + GDAL-provided name of a projected or geographic coordinate system, or an empty string on error + + If an error occurs, either because an invalid ID is specified, or the projection string + could not be loaded, a descriptive error will be raised to the Callback function (if one is specified). + + \new495 Added in version 4.9.5 + + + + Gets a list of ID,Name pairs of Projected and/or Geographic coordinate systems + One or a combination of values from the tkProjectionSet enumeration + Reference to an Object that will be filled with an array of strings + True if successful (list will contain an array of strings containing the ID/Name pairs associated with the specified Projection Sets), or False on failure (list will be empty) + + Each string will contain one pair of values, an ID and a Name, separated by a comma (e.g. "32611,WGS 84 / UTM zone 11N"). + These can be parsed and used, for example, to populate a ComboBox control for user selection of a Projection. + If an error occurs, or if the projection strings could not be loaded, a descriptive error will be raised to the Callback function (if one is specified). + + \new495 Added in version 4.9.5 @@ -10847,18 +11150,6 @@ The vector to use to calculate the dot product with the current vector object. The dot product of the current vector object and the specified vector. - - - Normalizes the vector. - - - - - Retrieves the error message associated with the specified error code. - - - - The global callback is the interface used by MapWinGIS to pass progress and error events to interested applications. @@ -10875,6 +11166,18 @@ Retrieves the last error generated in the object. + + + Normalizes the vector. + + + + + Retrieves the error message associated with the specified error code. + + + + Gets or sets the i component of the vector. @@ -10890,12 +11193,6 @@ Gets or sets the k component of the vector. - - - List of known extents (mostly countries of the world) - - \new491 Added in version 4.9.1 - @@ -11077,16 +11374,6 @@ The error code returned by LastErrorCode property. String with the description. - - - - Gets metadata item with specified index associated with current driver. - - Index of metadata item to be returned. - String with metadata. - - - Gets code of the last error which took place inside this object. @@ -11113,11 +11400,21 @@ Gets name driver (name of format) for this datasource. + Gets the number of metadata items associated with current driver. + + + Gets metadata item with specified index associated with current driver. + + Index of metadata item to be returned. + String with metadata. + + + Extracts the last error message reported by GDAL library. @@ -11814,6 +12111,27 @@ \deprecated v4.8. Use properties which take tkDefaultPointSymbol enumeration as input instead. + + + Available options applicable to point reflection + + \new495 Added in version 4.9.5 + + + + No reflection is applied + + + + + Symbol is flipped left-to-right + + + + + Symbol is flipped top-to-bottom + + The available parameters for the projections. @@ -13153,6 +13471,12 @@ Possible values of pixel offset mode (GDI+ rendering). + + + Supports the load of subsets of Projection Strings from Utils.GetProjectionStrings. + Can be combined to get NAD83 and/or WGS84, or the entire set. + + A strongly-typed resource class, for looking up localized strings, etc. @@ -13224,6 +13548,35 @@ \dotfile shapefilegroups.dot Graph description\n\n + + + Gets or sets an instance of ShapefileCategories class associated with the shapefile. + + The property can't be set to NULL (there is always an instance ShapefileCategories class associated with the Shapefile). + \new48 Added in version 4.8 + + + + Gets expression to be set for OpenFileDialog.Filter property to select ESRI shapefiles. + + + + + Gets or sets collision mode for point symbols for point and multi-point shapefiles. + + See tkCollisionMode enumeration. + \new48 Added in version 4.8 + + + + Gets or sets an instance of ShapeDrawingOptions class which holds default drawing options. + + + Default options are applied to every shape, which doesn't belong to a shapefile category. + The property can't be set to NULL (there is always an instance ShapeDrawingOptions class associated with shapefile). + + \new48 Added in version 4.8 + Restores the state of shapefile from the string. @@ -13243,6 +13596,26 @@ Use Shapefile.ErrorMsg(Shapefile.LastErrorCode) to find out the reason of failure. \new48 Added in version 4.8 + + + Gets bounding box which encompass all the shapes in the shapefile. + + When fast mode is set on, Shapefile.RefreshExtents call is needed to get the correct + extents after edits where made. + + + + Returns the handle of the shapefile. For inner use only. + + + + + Gets the name of the file which is used as a source for this instance of Shapefile class. + + + The property should be used for disk-based shapefiles only (see Shapefile.SourceType property). + + Generates labels for the shapefile based on values of the specified attribute. @@ -13255,6 +13628,87 @@ Labels of the multi-part shape are treated like a single label. \new48 Added in version 4.8 + + + Gets or sets the instance of the Labels class associated with the shapefile. + + The property can't be set to NULL (there is always an instance Labels class associated with shapefile). + \new48 Added in version 4.8 + + + + Gets or sets an instance of Charts class associated with the shapefile. + + The property can't be set to NULL (there is always an instance of Charts class associated with shapefile). + \new48 Added in version 4.8 + + + + Get or sets an instance of GeoProjection class associated with the shapefile. + + The property can't be set to NULL (there is always an instance of GeoProjection class associated with the shapefile). + \new48 Added in version 4.8 + + + + Gets or sets a Callback object which handles progress and error messages of the Shapefile class. + + + It's recommended to set it in case time consuming operation will be used (geoprocessing, generation of labels, etc). + The property is equal to NULL by default. + \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + + + + Sets an object which implements IStopExecution interface and facilitates stopping of the + geoprocessing operations. + + \new48 Added in version 4.8 + + + + A text string associated with the shapefile. Any value can be stored by developer in this property. + + + + + Gets the code of last error which took place inside this object. + + + To retrieve text description of error, use Shapefile.get_ErrorMsg(Shapefile.LastErrorCode). + Check this value if a certain method has failed. + + + + Gets the number of shapes in the shapefile. + + + + + Gets or sets the projection string for shapefile. String in proj4 and ESRI WKT formats are supported. + + \deprecated v 4.8 Use Shapefile.GeoProjection property instead. + + + + Gets the type of the shapefile. + + It is not possible to change the type of the shapefile without closing it. + + + + Gets the value which indicate the type the data used by shapefile object. + + See details in the description of tkShapefileSourceType enumeration. + \new48 Added in version 4.8 + + + + Gets or sets the expression which defines shapes to be visible on the map. + + In case of empty or invalid string all the shapes will be visible. + \new48 Added in version 4.8 + Gets the description of the specific error code. @@ -13325,6 +13779,12 @@ The index of shape to retrieve. The reference to the shape or NULL reference on invalid index. + + + Gets "flattened" shapefile type, i.e. Z and M components will be ignored. + + \new493 Added in version 4.9.3 + Gets rotation angle for a shape. @@ -13386,6 +13846,13 @@ Value indicating whether the shape is hidden. \new493 Added in version 4.9.3 + + + Gets or sets a value indicating whether this shapefile will be visible to cmIdentify tool. + + \see AxMap.CursorMode + \new493 Added in version 4.9.3 + Moves shapefile at specified offset. @@ -13420,6 +13887,13 @@ True on success \new494 Added in version 4.9.4 + + + Gets a value indicating whether shapefile is in append mode. + Any shapes added with Shapefile.EditAddShape will be immediately written to the disk. + + \new494 Added in version 4.9.4 + The sorting of the shapefile will be reapplied before next redraw after calling this method. @@ -13435,7 +13909,20 @@ True if the operations was successful. \new494 Added in version 4.9.4 - + + + The name of the field to be used to determine the drawing order of point shapes and labels. + + \new494 Added in version 4.9.4 + + + + Gets or sets a value indicating whether shapes will be sorted in ascending order. + + \see SortField + \new494 Added in version 4.9.4 + + Gets a specific field stored in the attribute table. @@ -13478,6 +13965,22 @@ It's recommended to pass NULL and use Shapefile.GlobalCallback property instead. True on success and false otherwise. + + + Gets the value indicating whether editing operations are allowed for shapefile attribute table. + + Use Shapefile.StartEditingTable and Shapefile.StopEditingTable to control editing mode. + + + + Gets the number of fields in attribute table of the shapefile. + + + + + Gets the reference to the attribute table associated with the shapefile. + + Opens editing mode for the attribute table. @@ -13512,6 +14015,22 @@ \new493 Added in version 4.9.3 + \addtogroup shapefile_editing Shapefile editing + Here is a list of properties and methods which control the editing of shapefile. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_editing { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Editing" URL="\ref shapefile_editing"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Deletes all the shapes from the shapefile. @@ -13542,6 +14061,13 @@ An invalid index will be automatically substituted with closest allowable value without reporting the error. True on success and false otherwise. + + + Gets the value indicating whether editing operations are allowed for shapefile. + + Shapefile.EditInsertShape, Shapefile.EditDeleteShape, Shapefile.EditClear are affected by this property. + \n Use Shapefile.StartEditingShapes and Shapefile.StopEditingShapes to control the editing mode. + Starts editing mode for the shapefile. @@ -13605,7 +14131,51 @@ True on success. \new493 Added in version 4.9.3 + + + Gets or sets a value indicating whether shapefile can be redrawn without redrawing other layer on the map. + + + All volatile shapefiles will be placed in main screen buffer (along with drawing layers) rather than data layer buffer, + so that their redraw can be forced with AxMap.Redraw2(tkRedrawType.RedrawSkipDataLayers). This can be recommended + for in-memory shapefiles with constantly changing values to ensure rendering performance. + + \new492 Added in version 4.9.2 + + + + Gets or sets a value indicating whether a shapefile can be edited with built-in interactive tools. + + Setting the property to true will automatically call Shapefile.StartEditingShapes if + shapefile hasn't been loaded in the memory already. Setting it false won't call Shapefile.StopEditingShapes, + only interactive tools will be disabled. + Interactive editing mode automatically sets Shapefile.Volatile property to true. + \see ShapeEditor, AxMap.CursorMode + \new493 Added in version 4.9.3 + + + + Gets or sets a value indicating whether interactive editing tools can snap to vertices of the shapefile. + + \new493 Added in version 4.9.3 + + \addtogroup shapefile_geoprocessing Shapefile geoprocessing + Here is a list of methods to perform geoprocessing tasks using shapefile data. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_geoprocessing { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Geoprocessing" URL="\ref shapefile_geoprocessing"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Creates a new shapefile by creating multi-part shapes from shapes with the same value of specified attribute. @@ -13676,706 +14246,324 @@ A value which indicates whether overlapping buffered shapes will be merged into a single shapes. A reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Clips current shapefile by the definition shapefile. - - A value which indicates whether all or only selected shape of this shapefile - will be treated as input. - The definition shapefile. - A value which indicates whether all or only selected shape of the definition shapefile - will be treated as input. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Calculates difference of 2 shapefiles. - - A value which indicates whether all or only selected shape of this shapefile - will be treated as input. - The overlay shapefile. - A value which indicates whether all or only selected shape of the overlay shapefile - will be treated as input. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Merges shapes of the input shapefile based on specified attribute. - - All shapes with the same value of the attribute will be merged in a single shape. - If the shapes aren't adjacent, then multi-part shape will be created. - An index of field from attribute table of the shapefile to dissolve by. - A boolean value which indicates whether all or only selected shapes will be processed. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Creates a new instance of shapefile class with single-part shapes produced from the - multi-part shapes of the input shapefile. - Single-part input shapes are moved to the output shapefile - without changes. Attribute values are copied to the output shapefile without changes. - A value which indicates whether the operation will be applied to the selected shapes only. - A new instance of Shapefile class with resultant shapes or NULL reference on failure. - \new48 Added in version 4.8 - - - - Creates a new instance of the shapefile class and copies selected shapes of the input shapefile to it. - - A new instance of shapefile class with selected shapes or NULL reference on failure. - \new48 Added in version 4.8 - - - - Creates a new shapefile by fixing invalid shapes of the input shapefile. - - The output shapefile. - True on successful fixing of all shapes and false if at least one shapes wasn't fixed. - \new48 Added in version 4.8 - - - - Calculates intersection of 2 input shapefiles. - - Intersection can generate shapes of different types. For example, the intersection of 2 polygons can be - a polygon, a polyline, a point or any combination of those. With SHP_NULLSHAPE fileType parameter the most obvious type will be used: - for example SHP_POLYGON for 2 polygon shapefiles. - A value which indicates whether operation will be applied to the selected shapes of the current shapefile only. - The second shapefile to perfrom intersection. - A value which indicates whether operation will be applied to the selected shapes of the second shapefile only. - The type of output shapefiles. SHP_NULLSHAPE value should be passed for automatic choosing of type. - An instance of class implementing ICallback interface. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Creates a new instance of shapefile class which holds shapes from 2 input shapefiles. - - - Both shapefiles must have the same ShpfileType. No changes to geometry of individual shapes are made. - Attribute values of both input shapefile will be passed to the resulting one. - - The value which indicates whether the operation will be applied - only to the selected shapes of the first shapefile. - The second shapefile to take shapes from. - A value which Indicates whether the operation will be applied - only to the selected shapes of the second shapefile - Reference to the output shapefile or NULL reference on failure - \new48 Added in version 4.8 - - - - Creates a new shapefile by re-projecting the current one. - - The projection of the output shapefile. - The output value with the number of shapes successfully reprojected. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Reprojects shapes of the current shapefile. - - The new projection. - The number of shapes successfully reprojected. - Returns true on success and false otherwise. - \new48 Added in version 4.8 - - - - aka SpatialQuery. Returns an array with indices of shapes of the current shapefile which - are in the specified relation to the definition shapefile. - - The definition shapefile. - The target relation between shapes of the 2 shapefiles. - The value which indicates whether only selected shapes of the definition shapefile will be used. - The resulting array of long data type with shape indices. - A callback object for passing to the client - the information about the progress and errors. - True in case at least one shape was selected and false otherwise. - \new48 Added in version 4.8 - - - - Creates a new shapefile by removing excessive vertices from the current shapefile - - Applicable to the polyline or polygon shapefiles only. - The initial shapefile remains intact. Attribute values are copied to the output shapefile without changes. - The minimal distance between 2 succeeding points. A succeeding point lying closer than - this value, will be removed. - A value which indicates whether all or only selected shapes will be processed. - A reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Sorts shapes in the shapefile based on the specified attribute. - - The index of field to set the sorting order. - A value which defines the sorting order. - Reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Calculates symmetrical difference of the 2 shapefiles. - - The operation consists of 2 mirror-like Difference operations. - Attribute values of both shapefiles are passed to the output one without changes. - Both input shapefiles remain intact. - A value which indicates that only selected shapes of the first shapefile will be processed. - The second shapefile. - A value which indicates that only selected shapes of the second shapefile will be processed. - A reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Calculates union of 2 shapefiles. - - The operation consists of intersection operation and 2 mirror-like difference operations. - The value which indicates that only selected shapes of the first shapefile will be processed. - The second shapefile. - The value which indicates that only selected shapes of the second shapefile will be processed. - A reference to the output shapefile or NULL reference on failure. - \new48 Added in version 4.8 - - - - Splits polylines at intersection with any other polylines. Works for polyline shapefile only. - - Resulting shapefile or null if the operation wasn't successful. - \new490 Added in version 4.9.0 - - - - Clears GEOS geometries cached during certain geoprocessing tasks. - - Shapefile.GetRelatedShapes currently is the only method that uses such caching - to improve performance if search is performed multiple times for different shapes. - \new491 Added in version 4.9.1 - - - - Loads data into in-memory shapefile from the specified shapefile on the disk. - - Filename of the shapefile to load from. - Callback interface. - True on success and false otherwise. - The shapefile object with remain in in-memory state. - \new491 Added in version 4.9.1 - - - - Writes the contents of the shapefile to specified file. - - Filename to write shapefile data to. - Callback interface. - True on success and false otherwise. - The state of shapefile won't be affected, i.e. in-memory shapefile will remain in-memory one. - \new491 Added in version 4.9.1 - - - Creates a copy of the shapefile. - Output shapefile will have the same type, projection and fields of the attribute table, - while shapes and the records of the attribute table aren't copied. - For complete copy of the shapefile use Shapefile.SelectAll() and Shapefile.ExportSelection(). - \new48 Added in version 4.8 - - - - Closes shapefile and releases all the resources. - - In case shapefile is in editing mode (Shapefile.EditingShapes = true) - all the edits will be discarded. - This value should not be analysed. - - - - - Initializes in-memory shapefile of the specified type with unique index field. - - MWShapeID field will be added to the attribute table. An increasing unique positive integer value - will be set in this field for each shape added to the shapefile. The field with MWShapeID name - created manually will be treated in the same way. - The name of the new shapefile. An empty string should be passed here. - Type of the shapefile to create. - Returns true on success and false otherwise. - - - - Opens shapefile from the disk. - - Any other shapefile currently opened will be closed without saving the changes. - Shapefile.SourceType property will be set to sstDiskBased. - The name of the file to open (.shp extension). - A callback object to report errors and progress information. - True on success and false otherwise. - Use Shapefile.get_ErrorMsg(Shapefile.LastErrorCode) to find out the reason of failure. - - - - Changes file associated with the current instance of the shapefile class. - - It is equivalent to consequent calling of Shapefile.Close and Shapefile.Open. - The filename of the new shapefile to be opened. - True on successful opening of the new shapefile or false otherwise. - - - - Saves edits of the in-memory shapefile to the disk without closing editing mode. - - Applicable only when Shapefile.EditingShapes = true. - A callback object to report errors and progress information. - True on successful saving and false otherwise. - - - - Saves in-memory shapefile to the disk. - - The name of the file to save data in. - A callback object to report errors and progress information. - True on successful saving and false otherwise. - - - - Saves shapefile to the disk. - - The new filename. - If set to true the editing for shapefile will be stopped. - If set to true the file will not be assigned as a source of this instance. - True on success. - \new494 Added in version 4.9.4 - - - - Caches the coordinates of shapefile points for faster point in shape test. - - Shapefile.EndPointInShapefile call is needed to release the memory. - True on successful caching and false otherwise. - - - - Clears the cached data allocated by Shapefile.BeginPointInShapefile. - - - - - Returns boolean value which indicates whether the given point is located within the specified shape. - - The operation is applicable for polygon shapefiles only. - The index shape (polygon) to perform the test. - X coordinate of the point. - Y coordinate of the point. - True in case the point is located within polygon and false otherwise. - - - - Returns a number which indicates the index of shapes within which a test point is situated. - - Call Shapefile.BeginPointInShapefile to improve performance. - The x coordinate of the point. - The y coordinate of the point. - The index of shape. - - - - Returns the number of points in the specified shape of the shapefile. - - This property is more efficient than calling Shapefile.get_Shape().NumPoints. - The index of the shape. - The number of points or -1 in case of invalid index. - There is a confusion with name casing for this property. - It's actually spelled 'get_NumPoints' in the source code. - However because of the known bug in PIA generation process the property - ended up spelled 'get_numPoints' in earlier version of PIAs. After some hesitation we decided to keep it that way. - See description of the bug here: http://stackoverflow.com/questions/3179676/c-exposed-property-for-com-in-idl-is-showing-as-lower-case-all-of-a-sudden - - - - Returns the extents of the shape with the given index. - - This operation is faster than Shapefile.get_Shape().Extents as there is no need to read all the shape data. - The index of the shape. - The extents of shape or NULL reference on failure. - - - - Returns the specified point of shape. - - This operation doesn't require the reading of all shape date from disk, therefore - it will be faster when editing mode is false. - The index of shape. - The point index. - The point or the NULL reference on the invalid index. - - - - Returns an array with the coordinates of points of the specified shape. - - The value specified in numPoints will be adjusted if the specified number is greater than the number of points. - The index of shape. - The number of point to return. - The array of double type with coordinates of the point. - Every two elements represent x and y coordinate of the point respectively. - - - - Refreshes extents of all shapes in the shapefile. - - See Shapefile.CacheExtents for the details. - The value can be omitted. - \new48 Added in version 4.8 - - - - Refreshes the extents of the particular shape in the shapefile. - - See Shapefile.CacheExtents for the details. - The index of the shape which extents are to be refreshed. - True on success and false in case of invalid shape index. - \new48 Added in version 4.8 - - - - Gets the vertex closest to the specified point. - - X coordinate of the point to search from. - Y coordinate of the point to search from. - Maximum distance to search. Use 0 to search at any distance. Passing the max distance can improve performance. - Index of shape to which closest vertex belongs. - Index of closest vertex within shape. - The distance to the closest vertex. - True if the vertex was found within specified distance and false otherwise. - \new490 Added in version 4.9.0 - - - - Gets shapes which are located at specified spatial relation to reference shape. - - Index of reference shape. - Spatial relation. Isn't implemented for Disjoint. - The array of indices of the found shapes (int[]) - True if at least one related shape was found. - \new490 Added in version 4.9.0 - - - - Gets shapes which are located at specified spatial relation to reference shape. - - Reference shape. - Spatial relation. Isn't implemented for Disjoint. - The array of indices of the found shapes (int[]) - True if at least one related shape was found. - \new490 Added in version 4.9.0 - - - - Gets the state of selection for the specified shape - - The index of shape - True in case the shape is selected and false otherwise. - \new48 Added in version 4.8 - - - - Selects or deselects the specified shape - - The index of shape to be selected. - A value which indicates whether a shape should be selected. - \new48 Added in version 4.8 - - - - Inverts selection of the shapefile, i.e. selection state of every shape is changed to the opposite value. - - \see Shapefile.get_ShapeSelected - \new48 Added in version 4.8 - - - - Selects all the shapes in the shapefile - - \new48 Added in version 4.8 - - - - Clears selection from all shapes. - - \new48 Added in version 4.8 - - - - Returns an array with indices of shapes which are located inside specified bounds. - - This method doesn't change the state of selection or visualization of shapes. - The bounding rectangular to select shapes within. - The value of tolerance. - Selection mode. - An output array of long type with the indices of the shapes. - True in case at least one shape is within bounds and false otherwise. - - - Gets the value which indicates whether spatial index will be used - for displaying certain extents of the shapefile. - \see SpatialIndexMaxAreaPercent - - - - Creates a new spatial index - - The name of shapefile to create spatial index for. - Filename of the current shapefile should be passed usually (Shapefile.Filename). - - - - - Checks the validity of the spatial index. - - True if the index is valid and false on its absence or incompatibility. - - - - Removes spatial index associated with shapefile (.mwd and .mwx files). - - True on success. - \new493 Added in version 4.9.3 - - - - Checks whether there are invalid shapes within shapefile. - - True if there invalid shapes and false otherwise. - \new490 Added in version 4.9.0 - - - - Gets or sets an instance of ShapefileCategories class associated with the shapefile. - - The property can't be set to NULL (there is always an instance ShapefileCategories class associated with the Shapefile). - \new48 Added in version 4.8 - - - - Gets expression to be set for OpenFileDialog.Filter property to select ESRI shapefiles. - - - - - Gets or sets collision mode for point symbols for point and multi-point shapefiles. - - See tkCollisionMode enumeration. - \new48 Added in version 4.8 - - - - Gets or sets an instance of ShapeDrawingOptions class which holds default drawing options. - - - Default options are applied to every shape, which doesn't belong to a shapefile category. - The property can't be set to NULL (there is always an instance ShapeDrawingOptions class associated with shapefile). - - \new48 Added in version 4.8 - - - - Gets bounding box which encompass all the shapes in the shapefile. - - When fast mode is set on, Shapefile.RefreshExtents call is needed to get the correct - extents after edits where made. + \new48 Added in version 4.8 - + - Returns the handle of the shapefile. For inner use only. + Clips current shapefile by the definition shapefile. + A value which indicates whether all or only selected shape of this shapefile + will be treated as input. + The definition shapefile. + A value which indicates whether all or only selected shape of the definition shapefile + will be treated as input. + Reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets the name of the file which is used as a source for this instance of Shapefile class. + Calculates difference of 2 shapefiles. - - The property should be used for disk-based shapefiles only (see Shapefile.SourceType property). - + A value which indicates whether all or only selected shape of this shapefile + will be treated as input. + The overlay shapefile. + A value which indicates whether all or only selected shape of the overlay shapefile + will be treated as input. + Reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets or sets the instance of the Labels class associated with the shapefile. + Merges shapes of the input shapefile based on specified attribute. - The property can't be set to NULL (there is always an instance Labels class associated with shapefile). + All shapes with the same value of the attribute will be merged in a single shape. + If the shapes aren't adjacent, then multi-part shape will be created. + An index of field from attribute table of the shapefile to dissolve by. + A boolean value which indicates whether all or only selected shapes will be processed. + Reference to the output shapefile or NULL reference on failure. \new48 Added in version 4.8 - + - Gets or sets an instance of Charts class associated with the shapefile. - - The property can't be set to NULL (there is always an instance of Charts class associated with shapefile). + Creates a new instance of shapefile class with single-part shapes produced from the + multi-part shapes of the input shapefile. + Single-part input shapes are moved to the output shapefile + without changes. Attribute values are copied to the output shapefile without changes. + A value which indicates whether the operation will be applied to the selected shapes only. + A new instance of Shapefile class with resultant shapes or NULL reference on failure. \new48 Added in version 4.8 - + - Get or sets an instance of GeoProjection class associated with the shapefile. + Creates a new instance of the shapefile class and copies selected shapes of the input shapefile to it. - The property can't be set to NULL (there is always an instance of GeoProjection class associated with the shapefile). + A new instance of shapefile class with selected shapes or NULL reference on failure. \new48 Added in version 4.8 - + - Gets or sets a Callback object which handles progress and error messages of the Shapefile class. + Creates a new shapefile by fixing invalid shapes of the input shapefile. - - It's recommended to set it in case time consuming operation will be used (geoprocessing, generation of labels, etc). - The property is equal to NULL by default. - \deprecated v4.9.3 Use GlobalSettings.ApplicationCallback instead. + The output shapefile. + True on successful fixing of all shapes and false if at least one shapes wasn't fixed. + \new48 Added in version 4.8 - + - Sets an object which implements IStopExecution interface and facilitates stopping of the - geoprocessing operations. + Gets or sets the engine (library) to use for geoprocessing operations. + The following methods are affected by this property. \new48 Added in version 4.8 - + - A text string associated with the shapefile. Any value can be stored by developer in this property. + Calculates intersection of 2 input shapefiles. + Intersection can generate shapes of different types. For example, the intersection of 2 polygons can be + a polygon, a polyline, a point or any combination of those. With SHP_NULLSHAPE fileType parameter the most obvious type will be used: + for example SHP_POLYGON for 2 polygon shapefiles. + A value which indicates whether operation will be applied to the selected shapes of the current shapefile only. + The second shapefile to perfrom intersection. + A value which indicates whether operation will be applied to the selected shapes of the second shapefile only. + The type of output shapefiles. SHP_NULLSHAPE value should be passed for automatic choosing of type. + An instance of class implementing ICallback interface. + Reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets the code of last error which took place inside this object. + Creates a new instance of shapefile class which holds shapes from 2 input shapefiles. - To retrieve text description of error, use Shapefile.get_ErrorMsg(Shapefile.LastErrorCode). - Check this value if a certain method has failed. + Both shapefiles must have the same ShpfileType. No changes to geometry of individual shapes are made. + Attribute values of both input shapefile will be passed to the resulting one. + + The value which indicates whether the operation will be applied + only to the selected shapes of the first shapefile. + The second shapefile to take shapes from. + A value which Indicates whether the operation will be applied + only to the selected shapes of the second shapefile + Reference to the output shapefile or NULL reference on failure + \new48 Added in version 4.8 - + - Gets the number of shapes in the shapefile. + Creates a new shapefile by re-projecting the current one. + The projection of the output shapefile. + The output value with the number of shapes successfully reprojected. + Reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets or sets the projection string for shapefile. String in proj4 and ESRI WKT formats are supported. + Reprojects shapes of the current shapefile. - \deprecated v 4.8 Use Shapefile.GeoProjection property instead. + The new projection. + The number of shapes successfully reprojected. + Returns true on success and false otherwise. + \new48 Added in version 4.8 - + - Gets the type of the shapefile. + aka SpatialQuery. Returns an array with indices of shapes of the current shapefile which + are in the specified relation to the definition shapefile. - It is not possible to change the type of the shapefile without closing it. + The definition shapefile. + The target relation between shapes of the 2 shapefiles. + The value which indicates whether only selected shapes of the definition shapefile will be used. + The resulting array of long data type with shape indices. + A callback object for passing to the client + the information about the progress and errors. + True in case at least one shape was selected and false otherwise. + \new48 Added in version 4.8 - + - Gets the value which indicate the type the data used by shapefile object. + Creates a new shapefile by removing excessive vertices from the current shapefile - See details in the description of tkShapefileSourceType enumeration. + Applicable to the polyline or polygon shapefiles only. + The initial shapefile remains intact. Attribute values are copied to the output shapefile without changes. + The minimal distance between 2 succeeding points. A succeeding point lying closer than + this value, will be removed. + A value which indicates whether all or only selected shapes will be processed. + A reference to the output shapefile or NULL reference on failure. \new48 Added in version 4.8 - + - Gets or sets the expression which defines shapes to be visible on the map. + Sorts shapes in the shapefile based on the specified attribute. - In case of empty or invalid string all the shapes will be visible. + The index of field to set the sorting order. + A value which defines the sorting order. + Reference to the output shapefile or NULL reference on failure. \new48 Added in version 4.8 - + - Gets "flattened" shapefile type, i.e. Z and M components will be ignored. + Calculates symmetrical difference of the 2 shapefiles. - \new493 Added in version 4.9.3 + The operation consists of 2 mirror-like Difference operations. + Attribute values of both shapefiles are passed to the output one without changes. + Both input shapefiles remain intact. + A value which indicates that only selected shapes of the first shapefile will be processed. + The second shapefile. + A value which indicates that only selected shapes of the second shapefile will be processed. + A reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets or sets a value indicating whether this shapefile will be visible to cmIdentify tool. + Calculates union of 2 shapefiles. - \see AxMap.CursorMode - \new493 Added in version 4.9.3 + The operation consists of intersection operation and 2 mirror-like difference operations. + The value which indicates that only selected shapes of the first shapefile will be processed. + The second shapefile. + The value which indicates that only selected shapes of the second shapefile will be processed. + A reference to the output shapefile or NULL reference on failure. + \new48 Added in version 4.8 - + - Gets a value indicating whether shapefile is in append mode. - Any shapes added with Shapefile.EditAddShape will be immediately written to the disk. + Splits polylines at intersection with any other polylines. Works for polyline shapefile only. - \new494 Added in version 4.9.4 + Resulting shapefile or null if the operation wasn't successful. + \new490 Added in version 4.9.0 - + - The name of the field to be used to determine the drawing order of point shapes and labels. + Clears GEOS geometries cached during certain geoprocessing tasks. - \new494 Added in version 4.9.4 + Shapefile.GetRelatedShapes currently is the only method that uses such caching + to improve performance if search is performed multiple times for different shapes. + \new491 Added in version 4.9.1 - + + \addtogroup shapefile_management Shapefile open and close + Here is a list of methods which affect the state of the shapefile. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_management { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Management" URL="\ref shapefile_management"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ - Gets or sets a value indicating whether shapes will be sorted in ascending order. + Loads data into in-memory shapefile from the specified shapefile on the disk. - \see SortField - \new494 Added in version 4.9.4 + Filename of the shapefile to load from. + Callback interface. + True on success and false otherwise. + The shapefile object with remain in in-memory state. + \new491 Added in version 4.9.1 - + - Gets the value indicating whether editing operations are allowed for shapefile attribute table. + Writes the contents of the shapefile to specified file. - Use Shapefile.StartEditingTable and Shapefile.StopEditingTable to control editing mode. + Filename to write shapefile data to. + Callback interface. + True on success and false otherwise. + The state of shapefile won't be affected, i.e. in-memory shapefile will remain in-memory one. + \new491 Added in version 4.9.1 - + + Creates a copy of the shapefile. + Output shapefile will have the same type, projection and fields of the attribute table, + while shapes and the records of the attribute table aren't copied. + For complete copy of the shapefile use Shapefile.SelectAll() and Shapefile.ExportSelection(). + \new48 Added in version 4.8 + + - Gets the number of fields in attribute table of the shapefile. + Closes shapefile and releases all the resources. + In case shapefile is in editing mode (Shapefile.EditingShapes = true) + all the edits will be discarded. + This value should not be analysed. - + + - Gets the reference to the attribute table associated with the shapefile. + Initializes in-memory shapefile of the specified type with unique index field. + MWShapeID field will be added to the attribute table. An increasing unique positive integer value + will be set in this field for each shape added to the shapefile. The field with MWShapeID name + created manually will be treated in the same way. + The name of the new shapefile. An empty string should be passed here. + Type of the shapefile to create. + Returns true on success and false otherwise. - + - Gets the value indicating whether editing operations are allowed for shapefile. + Opens shapefile from the disk. - Shapefile.EditInsertShape, Shapefile.EditDeleteShape, Shapefile.EditClear are affected by this property. - \n Use Shapefile.StartEditingShapes and Shapefile.StopEditingShapes to control the editing mode. + Any other shapefile currently opened will be closed without saving the changes. + Shapefile.SourceType property will be set to sstDiskBased. + The name of the file to open (.shp extension). + A callback object to report errors and progress information. + True on success and false otherwise. + Use Shapefile.get_ErrorMsg(Shapefile.LastErrorCode) to find out the reason of failure. - + - Gets or sets a value indicating whether shapefile can be redrawn without redrawing other layer on the map. + Changes file associated with the current instance of the shapefile class. - - All volatile shapefiles will be placed in main screen buffer (along with drawing layers) rather than data layer buffer, - so that their redraw can be forced with AxMap.Redraw2(tkRedrawType.RedrawSkipDataLayers). This can be recommended - for in-memory shapefiles with constantly changing values to ensure rendering performance. - - \new492 Added in version 4.9.2 + It is equivalent to consequent calling of Shapefile.Close and Shapefile.Open. + The filename of the new shapefile to be opened. + True on successful opening of the new shapefile or false otherwise. - + - Gets or sets a value indicating whether a shapefile can be edited with built-in interactive tools. + Saves edits of the in-memory shapefile to the disk without closing editing mode. - Setting the property to true will automatically call Shapefile.StartEditingShapes if - shapefile hasn't been loaded in the memory already. Setting it false won't call Shapefile.StopEditingShapes, - only interactive tools will be disabled. - Interactive editing mode automatically sets Shapefile.Volatile property to true. - \see ShapeEditor, AxMap.CursorMode - \new493 Added in version 4.9.3 + Applicable only when Shapefile.EditingShapes = true. + A callback object to report errors and progress information. + True on successful saving and false otherwise. - + - Gets or sets a value indicating whether interactive editing tools can snap to vertices of the shapefile. + Saves in-memory shapefile to the disk. - \new493 Added in version 4.9.3 + The name of the file to save data in. + A callback object to report errors and progress information. + True on successful saving and false otherwise. - + - Gets or sets the engine (library) to use for geoprocessing operations. + Saves shapefile to the disk. - The following methods are affected by this property. - \new48 Added in version 4.8 + The new filename. + If set to true the editing for shapefile will be stopped. + If set to true the file will not be assigned as a source of this instance. + True on success. + \new494 Added in version 4.9.4 + \addtogroup shapefile_optimizations Shapefile optimizations + Here is a list of properties and methods which doesn't provide additional functionality but + can improve the speed of certain operations with shapefile. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_optimizations { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Optimizations" URL="\ref shapefile_optimizations"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ Gets or sets a boolean value which indicates whether extents of shape will be recalculated before each redraw. @@ -14398,10 +14586,39 @@ but assign new coordinates to the points by calling Shape.put_XY only; - if you are bound to the exiting code with Shape.get_Point.x = [value] calls, set this property to true but call Shapefile.RefreshShapeExtents after the editing operations. - . - . \new48 Added in version 4.8 + + + Caches the coordinates of shapefile points for faster point in shape test. + + Shapefile.EndPointInShapefile call is needed to release the memory. + True on successful caching and false otherwise. + + + + Clears the cached data allocated by Shapefile.BeginPointInShapefile. + + + + + Returns boolean value which indicates whether the given point is located within the specified shape. + + The operation is applicable for polygon shapefiles only. + The index shape (polygon) to perform the test. + X coordinate of the point. + Y coordinate of the point. + True in case the point is located within polygon and false otherwise. + + + + Returns a number which indicates the index of shapes within which a test point is situated. + + Call Shapefile.BeginPointInShapefile to improve performance. + The x coordinate of the point. + The y coordinate of the point. + The index of shape. + Gets or sets the value which indicates whether fast mode will be used for the shapefile. @@ -14425,6 +14642,136 @@ \new48 Added in version 4.8 + + + Returns the number of points in the specified shape of the shapefile. + + This property is more efficient than calling Shapefile.get_Shape().NumPoints. + The index of the shape. + The number of points or -1 in case of invalid index. + There is a confusion with name casing for this property. + It's actually spelled 'get_NumPoints' in the source code. + However because of the known bug in PIA generation process the property + ended up spelled 'get_numPoints' in earlier version of PIAs. After some hesitation we decided to keep it that way. + See description of the bug here: http://stackoverflow.com/questions/3179676/c-exposed-property-for-com-in-idl-is-showing-as-lower-case-all-of-a-sudden + + + + Returns the extents of the shape with the given index. + + This operation is faster than Shapefile.get_Shape().Extents as there is no need to read all the shape data. + The index of the shape. + The extents of shape or NULL reference on failure. + + + + Returns the specified point of shape. + + This operation doesn't require the reading of all shape date from disk, therefore + it will be faster when editing mode is false. + The index of shape. + The point index. + The point or the NULL reference on the invalid index. + + + + Returns an array with the coordinates of points of the specified shape. + + The value specified in numPoints will be adjusted if the specified number is greater than the number of points. + The index of shape. + The number of point to return. + The array of double type with coordinates of the point. + Every two elements represent x and y coordinate of the point respectively. + + + + Refreshes extents of all shapes in the shapefile. + + See Shapefile.CacheExtents for the details. + The value can be omitted. + \new48 Added in version 4.8 + + + + Refreshes the extents of the particular shape in the shapefile. + + See Shapefile.CacheExtents for the details. + The index of the shape which extents are to be refreshed. + True on success and false in case of invalid shape index. + \new48 Added in version 4.8 + + + \addtogroup shapefile_selection Shapefile selection + Here is a list of properties and methods for managing shapefile selection. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_selection { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Selection" URL="\ref shapefile_selection"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + + Gets the vertex closest to the specified point. + + X coordinate of the point to search from. + Y coordinate of the point to search from. + Maximum distance to search. Use 0 to search at any distance. Passing the max distance can improve performance. + Index of shape to which closest vertex belongs. + Index of closest vertex within shape. + The distance to the closest vertex. + True if the vertex was found within specified distance and false otherwise. + \new490 Added in version 4.9.0 + + + + Gets shapes which are located at specified spatial relation to reference shape. + + Index of reference shape. + Spatial relation. Isn't implemented for Disjoint. + The array of indices of the found shapes (int[]) + True if at least one related shape was found. + \new490 Added in version 4.9.0 + + + + Gets shapes which are located at specified spatial relation to reference shape. + + Reference shape. + Spatial relation. Isn't implemented for Disjoint. + The array of indices of the found shapes (int[]) + True if at least one related shape was found. + \new490 Added in version 4.9.0 + + + + Gets the state of selection for the specified shape + + The index of shape + True in case the shape is selected and false otherwise. + \new48 Added in version 4.8 + + + + Selects or deselects the specified shape + + The index of shape to be selected. + A value which indicates whether a shape should be selected. + \new48 Added in version 4.8 + + + + Inverts selection of the shapefile, i.e. selection state of every shape is changed to the opposite value. + + \see Shapefile.get_ShapeSelected + \new48 Added in version 4.8 + Gets the number of selected shapes in the shapefile. @@ -14432,6 +14779,18 @@ \see Shapefile.get_ShapeSelected \new48 Added in version 4.8 + + + Selects all the shapes in the shapefile + + \new48 Added in version 4.8 + + + + Clears selection from all shapes. + + \new48 Added in version 4.8 + Gets or sets the way shapefile selection will be displayed. @@ -14460,12 +14819,58 @@ \new48 Added in version 4.8 + + + Returns an array with indices of shapes which are located inside specified bounds. + + This method doesn't change the state of selection or visualization of shapes. + The bounding rectangular to select shapes within. + The value of tolerance. + Selection mode. + An output array of long type with the indices of the shapes. + True in case at least one shape is within bounds and false otherwise. + + + \addtogroup shapefile_spatial_index Shapefile spatial index + Here is a list of properties and methods for managing of spatial index for a shapefile. + This module is a part of the documentation of Shapefile class. + \dot + digraph shapefile_sptial_index { + splines = true; + node [shape= "polygon", fontname=Helvetica, fontsize=9, style = filled, color = palegreen, height = 0.3, width = 1.2]; + lb [ label="Shapefile" URL="\ref Shapefile"]; + node [shape = "ellipse", color = khaki, width = 0.2, height = 0.2, style = filled] + gr [label="Spatial index" URL="\ref shapefile_spatial_index"]; + edge [ arrowhead="open", style = solid, arrowsize = 0.6, fontname = "Arial", fontsize = 9, fontcolor = blue, color = "#606060" ] + lb -> gr; + } + \enddot + Graph description + @{ + Gets the value which indicates whether spatial index will be used + for displaying certain extents of the shapefile. + \see SpatialIndexMaxAreaPercent + + + + Creates a new spatial index + + The name of shapefile to create spatial index for. + Filename of the current shapefile should be passed usually (Shapefile.Filename). + + Gets the value indicating whether spatial index exists for the shapefile. The set part of property does nothing. Use Shapefile.CreateSpatialIndex instead to create a new index. + + + Checks the validity of the spatial index. + + True if the index is valid and false on its absence or incompatibility. + Gets or sets the value which affects the usage of spatial index. @@ -14487,6 +14892,14 @@ Gets or sets a value which indicates whether spatial index should be used while working with shapefile. + + + Removes spatial index associated with shapefile (.mwd and .mwx files). + + True on success. + \new493 Added in version 4.9.3 + + Gets results of input data validation for geoprocessing methods. @@ -14501,5 +14914,11 @@ Use GlobalSettings.ShapeOutputValidationMode to change the settings. \new491 Added in version 4.9.1 + + + List of known extents (mostly countries of the world) + + \new491 Added in version 4.9.1 + diff --git a/src/InnoSetup/MapWinGIS-only.iss b/src/InnoSetup/MapWinGIS-only.iss index 6f79f5b1..84dae035 100644 --- a/src/InnoSetup/MapWinGIS-only.iss +++ b/src/InnoSetup/MapWinGIS-only.iss @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "MapWinGIS" -#define MyAppVersion "4.9.5.0" +#define MyAppVersion "4.9.6.0" #define MyAppPublisher "MapWindow Open Source GIS Community" #define MyAppURL "http://www.mapwindow.org" #define SetupLocation "D:\dev\MapwinGIS\GitHub\src\InnoSetup" @@ -121,11 +121,11 @@ Name: "MrSID"; Description: "Add MrSID support"; Types: full custom Name: "HDF5"; Description: "Add Hierarchical Data Format Release 5 support"; Types: full custom [Run] -; Install VC++ 2010 if needed: +; Install VC++ 2013 if needed: #ifdef x64BitVersion -Filename: "{tmp}\{#vcredist}"; Parameters: "/qb"; Flags: waituntilterminated; Check: VCRedistNeedsInstall_x64() +Filename: "{tmp}\{#vcredist}"; Parameters: "/quiet"; Flags: waituntilterminated; Check: VCRedistNeedsInstall_x64() #else -Filename: "{tmp}\{#vcredist}"; Parameters: "/qb"; Flags: waituntilterminated; Check: VCRedistNeedsInstall_x86() +Filename: "{tmp}\{#vcredist}"; Parameters: "/quiet"; Flags: waituntilterminated; Check: VCRedistNeedsInstall_x86() #endif ;Run some command files: Filename: "{app}\regMapWinGIS.cmd"; WorkingDir: "{app}"; Flags: runhidden diff --git a/src/InnoSetup/ReleaseNotes.rtf b/src/InnoSetup/ReleaseNotes.rtf index 7ec20bab..c80deadd 100644 Binary files a/src/InnoSetup/ReleaseNotes.rtf and b/src/InnoSetup/ReleaseNotes.rtf differ diff --git a/src/MapWinGIS.idl b/src/MapWinGIS.idl index c5131110..6480149e 100644 --- a/src/MapWinGIS.idl +++ b/src/MapWinGIS.idl @@ -9,6 +9,7 @@ //27 aug 2009 lsu - added ShapeDrawingOptions class // june 2017 PaulM - Added IGdalUtils // sep 2017 jfaust - Extend interfaces of IExtents and IPoint +// feb 2018 jfaust - added Boolean and Date fields #include #include @@ -2428,10 +2429,15 @@ enum tkScalebarUnits helpstring("Enumerated FieldType Types"), ] enum FieldType - { - [helpstring("STRING_FIELD")] STRING_FIELD= 0, + { + // note that types 0 through 3 match enumerated type values from ShapeLib.h + // although we have proposed a change to ShapeLib such that Dates are supported + [helpstring("STRING_FIELD")] STRING_FIELD = 0, [helpstring("INTEGER_FIELD")] INTEGER_FIELD = 1, [helpstring("DOUBLE_FIELD")] DOUBLE_FIELD = 2, + // jf, 2/17/2018, added Boolean and Date fields + [helpstring("BOOLEAN_FIELD")] BOOLEAN_FIELD = 3, + [helpstring("DATE_FIELD")] DATE_FIELD = 4 }FieldType; /******************************* Grid Enumerations *****************/ @@ -3262,6 +3268,146 @@ enum tkScalebarUnits Nad83_MTM_zone_17 = 32197, Nad83_Quebec_Lambert = 32198, Nad83_Louisiana_Offshore = 32199, + // following are the NAD83 State Plane constants from esri_extra.wkt + NAD_1983_StatePlane_Guam_FIPS_5400 = 65161, + // NOTE that the following are excluded (at least for now) to be + // consistent with CUtils::GetProjectionList, where we gather names + // based on their 'well-known' string prefix's (NAD83 or NAD_1983_S) + //Canada_Albers_Equal_Area_Conic = 102001, + //Canada_Lambert_Conformal_Conic = 102002, + //USA_Contiguous_Albers_Equal_Area_Conic = 102003, + //USA_Contiguous_Lambert_Conformal_Conic = 102004, + //USA_Contiguous_Equidistant_Conic = 102005, + //Alaska_Albers_Equal_Area_Conic = 102006, + //Hawaii_Albers_Equal_Area_Conic = 102007, + //North_America_Albers_Equal_Area_Conic = 102008, + //North_America_Lambert_Conformal_Conic = 102009, + //North_America_Equidistant_Conic = 102010, + //NAD_1983_Michigan_GeoRef_Feet_US = 102121, + //NAD_1983_Michigan_GeoRef_Meters = 102123, + NAD_1983_StatePlane_Alabama_East_FIPS_0101_Feet = 102629, + NAD_1983_StatePlane_Alabama_West_FIPS_0102_Feet = 102630, + NAD_1983_StatePlane_Alaska_1_FIPS_5001_Feet = 102631, + NAD_1983_StatePlane_Alaska_2_FIPS_5002_Feet = 102632, + NAD_1983_StatePlane_Alaska_3_FIPS_5003_Feet = 102633, + NAD_1983_StatePlane_Alaska_4_FIPS_5004_Feet = 102634, + NAD_1983_StatePlane_Alaska_5_FIPS_5005_Feet = 102635, + NAD_1983_StatePlane_Alaska_6_FIPS_5006_Feet = 102636, + NAD_1983_StatePlane_Alaska_7_FIPS_5007_Feet = 102637, + NAD_1983_StatePlane_Alaska_8_FIPS_5008_Feet = 102638, + NAD_1983_StatePlane_Alaska_9_FIPS_5009_Feet = 102639, + NAD_1983_StatePlane_Alaska_10_FIPS_5010_Feet = 102640, + NAD_1983_StatePlane_California_I_FIPS_0401_Feet = 102641, + NAD_1983_StatePlane_California_II_FIPS_0402_Feet = 102642, + NAD_1983_StatePlane_California_III_FIPS_0403_Feet = 102643, + NAD_1983_StatePlane_California_IV_FIPS_0404_Feet = 102644, + NAD_1983_StatePlane_California_V_FIPS_0405_Feet = 102645, + NAD_1983_StatePlane_California_VI_FIPS_0406_Feet = 102646, + NAD_1983_StatePlane_Arizona_East_FIPS_0201_Feet = 102648, + NAD_1983_StatePlane_Arizona_Central_FIPS_0202_Feet = 102649, + NAD_1983_StatePlane_Arizona_West_FIPS_0203_Feet = 102650, + NAD_1983_StatePlane_Arkansas_North_FIPS_0301_Feet = 102651, + NAD_1983_StatePlane_Arkansas_South_FIPS_0302_Feet = 102652, + NAD_1983_StatePlane_Colorado_North_FIPS_0501_Feet = 102653, + NAD_1983_StatePlane_Colorado_Central_FIPS_0502_Feet = 102654, + NAD_1983_StatePlane_Colorado_South_FIPS_0503_Feet = 102655, + NAD_1983_StatePlane_Connecticut_FIPS_0600_Feet = 102656, + NAD_1983_StatePlane_Delaware_FIPS_0700_Feet = 102657, + NAD_1983_StatePlane_Florida_East_FIPS_0901_Feet = 102658, + NAD_1983_StatePlane_Florida_West_FIPS_0902_Feet = 102659, + NAD_1983_StatePlane_Florida_North_FIPS_0903_Feet = 102660, + NAD_1983_StatePlane_Hawaii_1_FIPS_5101_Feet = 102661, + NAD_1983_StatePlane_Hawaii_2_FIPS_5102_Feet = 102662, + NAD_1983_StatePlane_Hawaii_3_FIPS_5103_Feet = 102663, + NAD_1983_StatePlane_Hawaii_4_FIPS_5104_Feet = 102664, + NAD_1983_StatePlane_Hawaii_5_FIPS_5105_Feet = 102665, + NAD_1983_StatePlane_Georgia_East_FIPS_1001_Feet = 102666, + NAD_1983_StatePlane_Georgia_West_FIPS_1002_Feet = 102667, + NAD_1983_StatePlane_Idaho_East_FIPS_1101_Feet = 102668, + NAD_1983_StatePlane_Idaho_Central_FIPS_1102_Feet = 102669, + NAD_1983_StatePlane_Idaho_West_FIPS_1103_Feet = 102670, + NAD_1983_StatePlane_Illinois_East_FIPS_1201_Feet = 102671, + NAD_1983_StatePlane_Illinois_West_FIPS_1202_Feet = 102672, + NAD_1983_StatePlane_Indiana_East_FIPS_1301_Feet = 102673, + NAD_1983_StatePlane_Indiana_West_FIPS_1302_Feet = 102674, + NAD_1983_StatePlane_Iowa_North_FIPS_1401_Feet = 102675, + NAD_1983_StatePlane_Iowa_South_FIPS_1402_Feet = 102676, + NAD_1983_StatePlane_Kansas_North_FIPS_1501_Feet = 102677, + NAD_1983_StatePlane_Kansas_South_FIPS_1502_Feet = 102678, + NAD_1983_StatePlane_Kentucky_North_FIPS_1601_Feet = 102679, + NAD_1983_StatePlane_Kentucky_South_FIPS_1602_Feet = 102680, + NAD_1983_StatePlane_Louisiana_North_FIPS_1701_Feet = 102681, + NAD_1983_StatePlane_Louisiana_South_FIPS_1702_Feet = 102682, + NAD_1983_StatePlane_Maine_East_FIPS_1801_Feet = 102683, + NAD_1983_StatePlane_Maine_West_FIPS_1802_Feet = 102684, + NAD_1983_StatePlane_Maryland_FIPS_1900_Feet = 102685, + NAD_1983_StatePlane_Massachusetts_Mainland_FIPS_2001_Feet = 102686, + NAD_1983_StatePlane_Massachusetts_Island_FIPS_2002_Feet = 102687, + NAD_1983_StatePlane_Michigan_North_FIPS_2111_Feet = 102688, + NAD_1983_StatePlane_Michigan_Central_FIPS_2112_Feet = 102689, + NAD_1983_StatePlane_Michigan_South_FIPS_2113_Feet = 102690, + NAD_1983_StatePlane_Minnesota_North_FIPS_2201_Feet = 102691, + NAD_1983_StatePlane_Minnesota_Central_FIPS_2202_Feet = 102692, + NAD_1983_StatePlane_Minnesota_South_FIPS_2203_Feet = 102693, + NAD_1983_StatePlane_Mississippi_East_FIPS_2301_Feet = 102694, + NAD_1983_StatePlane_Mississippi_West_FIPS_2302_Feet = 102695, + NAD_1983_StatePlane_Missouri_East_FIPS_2401_Feet = 102696, + NAD_1983_StatePlane_Missouri_Central_FIPS_2402_Feet = 102697, + NAD_1983_StatePlane_Missouri_West_FIPS_2403_Feet = 102698, + NAD_1983_StatePlane_Montana_FIPS_2500_Feet = 102700, + NAD_1983_StatePlane_Nebraska_FIPS_2600_Feet = 102704, + NAD_1983_StatePlane_Nevada_East_FIPS_2701_Feet = 102707, + NAD_1983_StatePlane_Nevada_Central_FIPS_2702_Feet = 102708, + NAD_1983_StatePlane_Nevada_West_FIPS_2703_Feet = 102709, + NAD_1983_StatePlane_New_Hampshire_FIPS_2800_Feet = 102710, + NAD_1983_StatePlane_New_Jersey_FIPS_2900_Feet = 102711, + NAD_1983_StatePlane_New_Mexico_East_FIPS_3001_Feet = 102712, + NAD_1983_StatePlane_New_Mexico_Central_FIPS_3002_Feet = 102713, + NAD_1983_StatePlane_New_Mexico_West_FIPS_3003_Feet = 102714, + NAD_1983_StatePlane_New_York_East_FIPS_3101_Feet = 102715, + NAD_1983_StatePlane_New_York_Central_FIPS_3102_Feet = 102716, + NAD_1983_StatePlane_New_York_West_FIPS_3103_Feet = 102717, + NAD_1983_StatePlane_New_York_Long_Island_FIPS_3104_Feet = 102718, + NAD_1983_StatePlane_North_Carolina_FIPS_3200_Feet = 102719, + NAD_1983_StatePlane_North_Dakota_North_FIPS_3301_Feet = 102720, + NAD_1983_StatePlane_North_Dakota_South_FIPS_3302_Feet = 102721, + NAD_1983_StatePlane_Ohio_North_FIPS_3401_Feet = 102722, + NAD_1983_StatePlane_Ohio_South_FIPS_3402_Feet = 102723, + NAD_1983_StatePlane_Oklahoma_North_FIPS_3501_Feet = 102724, + NAD_1983_StatePlane_Oklahoma_South_FIPS_3502_Feet = 102725, + NAD_1983_StatePlane_Oregon_North_FIPS_3601_Feet = 102726, + NAD_1983_StatePlane_Oregon_South_FIPS_3602_Feet = 102727, + NAD_1983_StatePlane_Pennsylvania_North_FIPS_3701_Feet = 102728, + NAD_1983_StatePlane_Pennsylvania_South_FIPS_3702_Feet = 102729, + NAD_1983_StatePlane_Rhode_Island_FIPS_3800_Feet = 102730, + NAD_1983_StatePlane_South_Carolina_FIPS_3900_Feet = 102733, + NAD_1983_StatePlane_South_Dakota_North_FIPS_4001_Feet = 102734, + NAD_1983_StatePlane_South_Dakota_South_FIPS_4002_Feet = 102735, + NAD_1983_StatePlane_Tennessee_FIPS_4100_Feet = 102736, + NAD_1983_StatePlane_Texas_North_FIPS_4201_Feet = 102737, + NAD_1983_StatePlane_Texas_North_Central_FIPS_4202_Feet = 102738, + NAD_1983_StatePlane_Texas_Central_FIPS_4203_Feet = 102739, + NAD_1983_StatePlane_Texas_South_Central_FIPS_4204_Feet = 102740, + NAD_1983_StatePlane_Texas_South_FIPS_4205_Feet = 102741, + NAD_1983_StatePlane_Utah_North_FIPS_4301_Feet = 102742, + NAD_1983_StatePlane_Utah_Central_FIPS_4302_Feet = 102743, + NAD_1983_StatePlane_Utah_South_FIPS_4303_Feet = 102744, + NAD_1983_StatePlane_Vermont_FIPS_4400_Feet = 102745, + NAD_1983_StatePlane_Virginia_North_FIPS_4501_Feet = 102746, + NAD_1983_StatePlane_Virginia_South_FIPS_4502_Feet = 102747, + NAD_1983_StatePlane_Washington_North_FIPS_4601_Feet = 102748, + NAD_1983_StatePlane_Washington_South_FIPS_4602_Feet = 102749, + NAD_1983_StatePlane_West_Virginia_North_FIPS_4701_Feet = 102750, + NAD_1983_StatePlane_West_Virginia_South_FIPS_4702_Feet = 102751, + NAD_1983_StatePlane_Wisconsin_North_FIPS_4801_Feet = 102752, + NAD_1983_StatePlane_Wisconsin_Central_FIPS_4802_Feet = 102753, + NAD_1983_StatePlane_Wisconsin_South_FIPS_4803_Feet = 102754, + NAD_1983_StatePlane_Wyoming_East_FIPS_4901_Feet = 102755, + NAD_1983_StatePlane_Wyoming_East_Central_FIPS_4902_Feet = 102756, + NAD_1983_StatePlane_Wyoming_West_Central_FIPS_4903_Feet = 102757, + NAD_1983_StatePlane_Wyoming_West_FIPS_4904_Feet = 102758, + NAD_1983_StatePlane_Puerto_Rico_Virgin_Islands_FIPS_5200_Feet = 102761, + NAD_1983_StatePlane_Guam_FIPS_5400_Feet = 102766, }tkNad83Projection; typedef @@ -3406,6 +3552,8 @@ enum tkScalebarUnits Wgs84_UTM_zone_59S = 32759, Wgs84_UTM_zone_60S = 32760, Wgs84_UPS_South_NE = 32761, + // following are the WGS84 constants from esri_extra.wkt + WGS_1984_Web_Mercator = 102113, }tkWgs84Projection; typedef @@ -5747,6 +5895,8 @@ interface IGlobalSettings : IDispatch{ [propput, id(68)] HRESULT CallbackVerbosity([in] tkCallbackVerbosity newVal); [propget, id(69)] HRESULT OgrShareConnection([out, retval] VARIANT_BOOL* pVal); [propput, id(69)] HRESULT OgrShareConnection([in] VARIANT_BOOL newVal); + [propget, id(70)] HRESULT OgrInterpretYNStringAsBoolean([out, retval] VARIANT_BOOL* pVal); + [propput, id(70)] HRESULT OgrInterpretYNStringAsBoolean([in] VARIANT_BOOL newVal); }; [ @@ -6920,6 +7070,8 @@ library MapWinGIS [id(231), propget] tkZoomBoxStyle ZoomBoxStyle(); [id(261), propget] VARIANT_BOOL UseAlternatePanCursor(); [id(261), propput] void UseAlternatePanCursor(VARIANT_BOOL nNewValue); + [id(262), propget] VARIANT_BOOL RecenterMapOnZoom(); + [id(262), propput] void RecenterMapOnZoom(VARIANT_BOOL nNewValue); #endif [id(43)] void Resize(long Width, long Height); diff --git a/src/MapWinGIS.rc b/src/MapWinGIS.rc index 7ce4cf1d..3dd2687a 100644 --- a/src/MapWinGIS.rc +++ b/src/MapWinGIS.rc @@ -112,8 +112,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 4,9,5,0 - PRODUCTVERSION 4,9,5,0 + FILEVERSION 4,9,6,0 + PRODUCTVERSION 4,9,6,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -131,13 +131,13 @@ BEGIN VALUE "Comments", "This control includes a mapping component and objects for reading and writing shapefiles and various triangulated irregular network and grid files. It also has extensive label and chart options and includes projection routines." VALUE "CompanyName", "MapWindow OSS Team - www.mapwindow.org" VALUE "FileDescription", "MapWinGIS ActiveX Control" - VALUE "FileVersion", "4.9.5.0" + VALUE "FileVersion", "4.9.6.0" VALUE "InternalName", "MapWinGIS ActiveX Control" VALUE "LegalCopyright", "Copyright (C) 2004-2017 MapWindow OSS Team" - VALUE "LegalTrademarks", "MapWindow GIS is a trademark of Daniel P. Ames, 2005-2017" + VALUE "LegalTrademarks", "MapWindow GIS is a trademark of Daniel P. Ames, 2005-2018" VALUE "OriginalFilename", "MapWinGIS.ocx" VALUE "ProductName", "MapWinGIS ActiveX Control" - VALUE "ProductVersion", "4.9.5.0" + VALUE "ProductVersion", "4.9.6.0" END END BLOCK "VarFileInfo" diff --git a/src/MapWinGIS.vcxproj b/src/MapWinGIS.vcxproj index 013fe474..992c1a97 100644 --- a/src/MapWinGIS.vcxproj +++ b/src/MapWinGIS.vcxproj @@ -96,7 +96,7 @@ Speed true true - $(ProjectDir)..\Support\include;$(ProjectDir)..\Support\include\atlhttp;$(ProjectDir)..\Support\ERDAS-ECW-JPEG-2000-SDK-5.0\include;$(ProjectDir);$(ProjectDir)\COM classes;$(ProjectDir)\ComHelpers;$(ProjectDir)\Control;$(ProjectDir)\Drawing;$(ProjectDir)\Grid;$(ProjectDir)\Image;$(ProjectDir)\Processing;$(ProjectDir)\Shapefile;$(ProjectDir)\ShapeNetwork;$(ProjectDir)\Structures;$(ProjectDir)\Tin;$(ProjectDir)\Utilities;$(ProjectDir)\Grid\fip;$(ProjectDir)\Utilities\SpatialIndex;$(ProjectDir)\Tiles;$(ProjectDir)\Tiles\Providers;$(ProjectDir)\Tiles\Caching;$(ProjectDir)\Tiles\Loaders;$(ProjectDir)\Tiles\Projections;$(ProjectDir)\Tiles\Http;$(ProjectDir)\Utilities\SQLite;$(ProjectDir)..\Support\GDAL_SDK\$(PlatformToolset)\include\$(Platform);$(ProjectDir)\Ogr;$(ProjectDir)\Editor;%(AdditionalIncludeDirectories) + $(ProjectDir)..\Support\include;$(ProjectDir)..\Support\include\atlhttp;$(ProjectDir)..\support\include\ShapeLib;$(ProjectDir)..\Support\ERDAS-ECW-JPEG-2000-SDK-5.0\include;$(ProjectDir);$(ProjectDir)\COM classes;$(ProjectDir)\ComHelpers;$(ProjectDir)\Control;$(ProjectDir)\Drawing;$(ProjectDir)\Grid;$(ProjectDir)\Image;$(ProjectDir)\Processing;$(ProjectDir)\Shapefile;$(ProjectDir)\ShapeNetwork;$(ProjectDir)\Structures;$(ProjectDir)\Tin;$(ProjectDir)\Utilities;$(ProjectDir)\Grid\fip;$(ProjectDir)\Utilities\SpatialIndex;$(ProjectDir)\Tiles;$(ProjectDir)\Tiles\Providers;$(ProjectDir)\Tiles\Caching;$(ProjectDir)\Tiles\Loaders;$(ProjectDir)\Tiles\Projections;$(ProjectDir)\Tiles\Http;$(ProjectDir)\Utilities\SQLite;$(ProjectDir)..\Support\GDAL_SDK\$(PlatformToolset)\include\$(Platform);$(ProjectDir)\Ogr;$(ProjectDir)\Editor;%(AdditionalIncludeDirectories) _NDBGSYMBOLS;_WINDOWS;_USRDLL;_AFXDLL;_CRT_SECURE_NO_WARNINGS;GEOS_NEW;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) true false @@ -132,7 +132,7 @@ true /ignore:4099 /Ignore:4254 %(AdditionalOptions) - cqlib.lib;GdiPlus.lib;gdal_i.lib;version.lib;Crypt32.lib;Dbghelp.lib;SpatialIndex-mw.lib;geos_c.lib;libtiff_i.lib;%(AdditionalDependencies) + cqlib.lib;GdiPlus.lib;gdal_i.lib;version.lib;Crypt32.lib;Dbghelp.lib;SpatialIndex-mw.lib;geos_c.lib;libtiff_i.lib;ShapeLib.lib;%(AdditionalDependencies) NotSet $(OutDir)MapWinGIS.ocx true @@ -447,9 +447,7 @@ if $(PlatformName) == x64 setx MapWinGISBin64 $(OutputPath) - - diff --git a/src/MapWinGIS.vcxproj.filters b/src/MapWinGIS.vcxproj.filters deleted file mode 100644 index 3bf96526..00000000 --- a/src/MapWinGIS.vcxproj.filters +++ /dev/null @@ -1,2213 +0,0 @@ - - - - - {b1b36038-0d81-4587-97ff-8bbca0e61d54} - - - {23515828-dffe-443d-8e7b-f46f0dd4e9a6} - - - {92202faa-c74e-46af-b2ff-1d04f983e056} - - - {e0b86195-4fed-4c53-9e14-63011a417640} - - - {6c8af1dc-542d-4a73-8760-5b03c2cb2092} - - - {c4f35b07-fdb6-4fcf-bbc3-f96f82cb499b} - - - {f8512988-5553-4875-9627-d03c771dac11} - - - {6216b319-1817-4cdc-8b65-b2c466694c26} - - - {e58ed838-d593-4486-af37-f55e20bae25c} - - - {7d666d4b-91b4-4df0-ade5-933b35a7861e} - - - {34d404a5-b81f-4c14-b965-26eb712c9b6b} - - - {a5b6e22b-10ab-405a-97a6-3a687ea44c23} - - - {48fa83ef-ea74-4aea-baa4-a6972ca5cc61} - - - {b47bbc53-9196-4199-b672-21eb7f49839b} - - - {5a0bd19f-e0e8-43ae-bb74-09723f3a76f5} - - - {0ee3bb88-4203-4ab2-839f-e5ec642211ed} - - - {ba3155c3-f3b8-4d0d-aaa4-4bc9e7c0606c} - - - {ed5bccc3-ad75-4623-94b0-f48bb22e3958} - - - {5d94ec33-a9ef-4950-bf37-45439f2544be} - - - {f4d2fc99-8546-4817-a89d-93d6d7cb3fd4} - - - {4d709ff4-8585-4ba4-a7ad-aaa6813bc8c7} - - - {41e87872-07a9-40e4-9189-b95a36012e5c} - - - {53450993-d92b-49bd-ba48-9fcfdb12c188} - - - {fb74bb0b-2317-4100-9c1b-f3022a304ac1} - - - {3a41669f-5b51-4a20-b150-590c68fa301a} - - - {1b3ec4ec-9b54-444a-b327-5b9be51ac6f4} - - - {7e2c1743-0255-48b3-9224-76fcf92f3661} - - - {a7a67483-9daa-467e-a255-4f511e28ff39} - - - {0fcf224e-062b-4548-bddb-0d072143bce2} - - - {74d43682-27e2-4136-b0b9-97eb9f4451f5} - - - {8d3a0bb5-5268-4f98-9311-869cdcdbf73a} - - - - - Structures - - - Structures - - - Structures - - - Structures - - - Structures - - - Structures - - - Structures - - - Structures - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - Image\Headers - - - Image\Headers - - - Image\Headers - - - Image\Headers - - - Image\Headers - - - Image\Headers - - - Image\Headers - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities\MemLeak - - - Utilities\MemLeak - - - Utilities\MemLeak - - - Utilities\SQLite - - - Utilities\SQLite - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid\fip - - - Grid\fip - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile\IndexSearching - - - Shapefile\IndexSearching - - - Shapefile\IndexSearching - - - Tin - - - Tin - - - Tin - - - Tin - - - Tin - - - Tin - - - Tin - - - Tin - - - Tin - - - ShapeNetwork - - - ShapeNetwork - - - ShapeNetwork - - - ShapeNetwork - - - ShapeNetwork - - - Processing\GeographicLib - - - Processing\GeographicLib - - - Processing\GeographicLib - - - Processing\GeographicLib - - - Processing\GeographicLib - - - Processing\GeographicLib - - - Processing\GeographicLib - - - Tiles\Providers - - - Tiles\Providers - - - Tiles\Providers - - - Tiles\Providers - - - Tiles\Providers - - - Tiles\Providers - - - Tiles\Projections - - - Tiles\Projections - - - Tiles\Projections - - - Tiles\Projections - - - - Utilities - - - COM classes\Headers - - - Image\Headers - - - COM classes\Headers - - - COM classes\Headers - - - COM classes\Headers - - - - - COM classes\Headers - - - Control - - - Ogr - - - Ogr - - - Ogr - - - Ogr - - - Ogr - - - Ogr - - - Ogr - - - Utilities - - - Ogr - - - Ogr - - - Processing - - - Processing - - - Processing - - - Processing - - - Processing - - - Processing - - - Processing - - - Processing - - - Ogr - - - Shapefile - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Shapefile - - - Shapefile - - - Editor - - - Editor - - - Editor - - - Editor - - - Editor - - - Editor - - - Editor - - - Editor - - - Editor - - - COM classes\Headers - - - Editor - - - Utilities - - - Utilities - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - Drawing - - - ComHelpers - - - ComHelpers - - - Utilities - - - COM classes\Headers - - - ComHelpers - - - COM classes\Headers - - - COM classes\Headers - - - ComHelpers - - - Image\Headers - - - COM classes\Headers - - - COM classes\Headers - - - Utilities - - - COM classes\Headers - - - Image\Headers - - - Image\Headers - - - Structures - - - COM classes\Headers - - - Processing - - - Processing - - - Processing - - - COM classes\Headers - - - Processing - - - COM classes\Headers - - - Drawing - - - Drawing - - - Drawing - - - Image\Headers - - - Utilities - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Tiles\Providers - - - Tiles\Providers - - - Tiles\Providers - - - ComHelpers - - - COM classes\Headers - - - Tiles - - - Tiles - - - Tiles - - - Tiles - - - Tiles - - - Tiles\Caching - - - Tiles\Caching - - - Tiles\Caching - - - Tiles\Caching - - - Tiles\Caching - - - Tiles\Caching - - - Tiles\Caching - - - Tiles\Loaders - - - Tiles\Loaders - - - Tiles\Loaders - - - Tiles\Loaders - - - Tiles\Loaders - - - Tiles\Loaders - - - Tiles\Http - - - Tiles\Http - - - Tiles\Http - - - COM classes\Headers - - - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - Image\Source - - - Image\Source - - - Image\Source - - - Image\Source - - - Image\Source - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Control - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities - - - Utilities\MemLeak - - - Utilities\MemLeak - - - Utilities\SQLite - - - Utilities\SQLite - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Grid\fip - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile - - - Shapefile\IndexSearching - - - Shapefile\IndexSearching - - - Shapefile\IndexSearching - - - Tin - - - Tin - - - Tin - - - Tin - - - Tin - - - Tin - - - ShapeNetwork - - - ShapeNetwork - - - Processing\GeographicLib - - - Processing\GeographicLib - - - Processing\GeographicLib - - - Tiles\Providers - - - Tiles\Projections - - - Tiles\Projections - - - Utilities - - - COM classes\Source - - - COM classes\Source - - - COM classes\Source - - - Control - - - - COM classes\Source - - - Control - - - Structures - - - Ogr - - - Ogr - - - Ogr - - - Ogr - - - Ogr - - - Ogr - - - Ogr - - - Utilities - - - Ogr - - - Ogr - - - Processing - - - Processing - - - Processing - - - Processing - - - Processing - - - Processing - - - Processing - - - Ogr - - - Shapefile - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Drawing - - - Shapefile - - - Editor - - - Editor - - - Editor - - - Editor - - - Editor - - - Editor - - - Editor - - - Editor - - - Editor - - - COM classes\Source - - - Editor - - - Utilities - - - Utilities - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - ComHelpers - - - Drawing - - - ComHelpers - - - ComHelpers - - - Tiles\Providers - - - COM classes\Source - - - ComHelpers - - - COM classes\Source - - - COM classes\Source - - - ComHelpers - - - Image\Source - - - COM classes\Source - - - Structures - - - COM classes\Source - - - Utilities - - - COM classes\Source - - - Utilities - - - Image\Source - - - Image\Source - - - Control - - - COM classes\Source - - - Processing - - - Processing - - - Processing - - - COM classes\Source - - - Processing - - - COM classes\Source - - - Drawing - - - Drawing - - - Drawing - - - Image\Source - - - Utilities - - - Shapefile - - - Shapefile - - - Shapefile - - - COM classes\Source - - - Tiles\Projections - - - Tiles\Providers - - - Tiles\Providers - - - Tiles\Providers - - - Control - - - ComHelpers - - - COM classes\Source - - - Tiles - - - Tiles - - - Tiles - - - Tiles\Caching - - - Tiles\Caching - - - Tiles\Caching - - - Tiles\Caching - - - Tiles\Caching - - - Tiles\Caching - - - Tiles\Loaders - - - Tiles\Loaders - - - Tiles\Loaders - - - Tiles\Loaders - - - Tiles\Loaders - - - Tiles\Loaders - - - Tiles\Http - - - Tiles\Http - - - COM classes\Source - - - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - Grid\fip - - - Grid\fip - - - - COM classes\Resources - - - COM classes\Resources - - - - COM classes\Resources - - - Resources - - - Resources - - - Resources - - - Resources - - - Resources - - - Resources - - - Resources - - - COM classes\Resources - - - COM classes\Resources - - - Resources - - - Resources - - - Resources - - - Resources - - - Resources - - - Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - COM classes\Resources - - - Resources - - - - - - - - Utilities - - - - - - \ No newline at end of file diff --git a/src/Ogr/Ogr2Shape.cpp b/src/Ogr/Ogr2Shape.cpp index dc5aa4a9..443e2b05 100644 --- a/src/Ogr/Ogr2Shape.cpp +++ b/src/Ogr/Ogr2Shape.cpp @@ -138,6 +138,7 @@ void Ogr2Shape::CopyFields(OGRLayer* layer, IShapefile* sf) OGRFieldType type = oField->GetType(); if (type == OFTInteger) fld->put_Type(INTEGER_FIELD); + else if (type == OFTDate) fld->put_Type(DATE_FIELD); else if (type == OFTReal) fld->put_Type(DOUBLE_FIELD); else if (type == OFTString) fld->put_Type(STRING_FIELD); @@ -260,6 +261,18 @@ bool Ogr2Shape::FillShapefile(OGRLayer* layer, IShapefile* sf, int maxFeatureCou return true; } +// is the specified character one of the valid XBase Logical characters +bool isXBaseLogicalChar(char c) +{ + return (c == 'Y' || c == 'N' || c == 'T' || c == 'F' || c == '?'); // || c == 'y' || c == 'n' || c == 't' || c == 'f'); +} + +// is the specified character one of the valid XBase Logical characters indicating TRUE +bool isXBaseLogicalTrue(char c) +{ + return (c == 'Y' || c == 'T'); // || c == 'y' || c == 't'); +} + // ************************************************************* // CopyValues() // ************************************************************* @@ -296,10 +309,43 @@ void Ogr2Shape::CopyValues(OGRFeatureDefn* poFields, OGRFeature* poFeature, ISha var.vt = VT_R8; var.dblVal = poFeature->GetFieldAsDouble(iFld); } - else //if (type == OFTString ) + else if (type == OFTDate) + { + int m, d, y, h, min, sec, flag; + // should be able to read an an Integer + int nFullDate = poFeature->GetFieldAsDateTime(iFld, &y, &m, &d, &h, &min, &sec, &flag); + //y = (nFullDate / 10000); + //m = ((nFullDate / 100) % 100); + //d = (nFullDate % 100); + COleDateTime dt(y, m, d, 0, 0, 0); + var.vt = VT_DATE; + var.date = dt.m_dt; + } + else if (type == OFTString) { - var.vt = VT_BSTR; - var.bstrVal = A2BSTR(poFeature->GetFieldAsString(iFld)); // BSTR will be cleared by CComVariant destructor + // preview string + CString str(poFeature->GetFieldAsString(iFld)); + // OGR does not currently support the Logical (boolean) field type. It is possible that they will exist + // in the file, but OGR will interpret them as Strings. Since we support boolean field types, we want + // to have a way of copying these particular string fields and interpreting them as booleans. We will + // take the position that a single-character string field that contains any one of the valid XBase logical + // characters is actually a Logical field. This behavior can be turned off in the global settings. + // NOTE: ESRI stores these values as Y and N, but the XBase spec indicates that it could also be a T or F, + // or lower case y, n, t, or f; so I have set up this test to accept all of the valid characters. + // So, if the string is a single character, equal to one of the valid XBase Logical characters, + // AND our global settings are set to interpret a Yes/No character as a boolean, then do so. + if (m_globalSettings.ogrInterpretYNStringAsBoolean && str.GetLength() == 1 && isXBaseLogicalChar(str.MakeUpper()[0])) + { + // interpret as a boolean + var.vt = VT_BOOL; + var.boolVal = isXBaseLogicalTrue(str.MakeUpper()[0]) ? VARIANT_TRUE : VARIANT_FALSE; + } + else + { + // else accept as a string + var.vt = VT_BSTR; + var.bstrVal = A2BSTR(poFeature->GetFieldAsString(iFld)); // BSTR will be cleared by CComVariant destructor + } } } else diff --git a/src/Tiles/Caching/DiskCache.h b/src/Tiles/Caching/DiskCache.h index dff96bfb..23a1b603 100644 --- a/src/Tiles/Caching/DiskCache.h +++ b/src/Tiles/Caching/DiskCache.h @@ -16,7 +16,9 @@ * DEALINGS IN THE SOFTWARE. ************************************************************************************** * Contributor(s): - * (Open source contributors should list themselves and their modifications here). */ + * (Open source contributors should list themselves and their modifications here). + * Jan. 2018, Paul Meems, fixing MWGIS-108 + */ #pragma once #include "ITileCache.h" @@ -27,7 +29,7 @@ class DiskCache: public ITileCache DiskCache::DiskCache(CStringW path, CStringW extension) : _init(false) { - _ext = _ext; + _ext = extension; _rootPath = path; _encoder = L"image/png"; // default diff --git a/src/Tiles/Caching/PrefetchManager.cpp b/src/Tiles/Caching/PrefetchManager.cpp index 4902a732..a9924808 100644 --- a/src/Tiles/Caching/PrefetchManager.cpp +++ b/src/Tiles/Caching/PrefetchManager.cpp @@ -117,6 +117,12 @@ long PrefetchManager::Prefetch(BaseProvider* provider, CRect indices, int zoom, if (points.size() == 0) { + if (tilesLogger.IsOpened()) + { + tilesLogger.out() << "\n"; + tilesLogger.out() << "Nothing to fetch\n"; + tilesLogger.out() << "---------------------" << endl; + } return 0; } diff --git a/src/Tiles/Providers/OpenStreetMapProvider.h b/src/Tiles/Providers/OpenStreetMapProvider.h index 18140e87..07869af4 100644 --- a/src/Tiles/Providers/OpenStreetMapProvider.h +++ b/src/Tiles/Providers/OpenStreetMapProvider.h @@ -38,10 +38,10 @@ class OpenStreetMapProvider : public BaseProvider this->_projection = new MercatorProjection(); _subProviders.push_back(this); _serverLetters = "abc"; - _refererUrl = "http://www.openstreetmap.org/"; - _urlFormat = "http://%c.tile.openstreetmap.org/%d/%d/%d.png"; + _refererUrl = "https://www.openstreetmap.org/"; + _urlFormat = "https://%c.tile.openstreetmap.org/%d/%d/%d.png"; _maxZoom = 19; - _licenseUrl = "http://wiki.openstreetmap.org/wiki/Tile_usage_policy"; + _licenseUrl = "https://wiki.openstreetmap.org/wiki/Tile_usage_policy"; } CString MakeTileImageUrl(CPoint &pos, int zoom) @@ -87,7 +87,7 @@ class OpenHumanitarianMapProvider : public OpenStreetMapProvider { Id = tkTileProvider::OpenHumanitarianMap; Name = "OpenHumanitarianMap"; - _refererUrl = "http://www.openstreetmap.org/"; + _refererUrl = "https://www.openstreetmap.org/"; _urlFormat = "http://%c.tile.openstreetmap.fr/hot/%d/%d/%d.png"; } }; diff --git a/src/Utilities/SpatialIndex/IndexShapeFiles.cpp b/src/Utilities/SpatialIndex/IndexShapeFiles.cpp index 2269c6e7..f97695d2 100644 --- a/src/Utilities/SpatialIndex/IndexShapeFiles.cpp +++ b/src/Utilities/SpatialIndex/IndexShapeFiles.cpp @@ -37,159 +37,173 @@ namespace IndexSearching ** ** ************************************************************************* */ bool createIndexFile(double utilization, int capacity, string baseName) - { + { bool ret = false; - IStorageManager *diskfile; - StorageManager::IBuffer *file; - ISpatialIndex *tree; + IStorageManager *diskfile = nullptr; + StorageManager::IBuffer *file = nullptr; + ISpatialIndex *tree = nullptr; - try + try { - // Create a new storage manager with the provided base name and a 4K page size. - diskfile = StorageManager::createNewDiskStorageManager(baseName, 4096); - file = StorageManager::createNewRandomEvictionsBuffer(*diskfile, capacity, false); + // Create a new storage manager with the provided base name and a 4K page size. + diskfile = StorageManager::createNewDiskStorageManager(baseName, 4096); + file = StorageManager::createNewRandomEvictionsBuffer(*diskfile, capacity, false); - ShapeFileStream inputStream(baseName); + ShapeFileStream inputStream(baseName); - // Create and bulk load a new RTree with dimensionality 2, using "file" as - // the StorageManager and the RSTAR splitting policy. - id_type indexIdentifier; + // Create and bulk load a new RTree with dimensionality 2, using "file" as + // the StorageManager and the RSTAR splitting policy. + id_type indexIdentifier; #ifndef __DEBUG - tree = RTree::createAndBulkLoadNewRTree(RTree::BLM_STR, inputStream, *file, utilization, - capacity, capacity, 2, SpatialIndex::RTree::RV_RSTAR, indexIdentifier); + tree = RTree::createAndBulkLoadNewRTree(RTree::BLM_STR, inputStream, *file, utilization, + capacity, capacity, 2, SpatialIndex::RTree::RV_RSTAR, indexIdentifier); #endif - ret = tree->isIndexValid(); - + ret = tree->isIndexValid(); + } + catch (char *str) + { + ret = false; + cerr << "Got an error " << str << endl; + } + catch (exception ex) + { + ret = false; + cerr << "Got an error " << ex.what() << endl; + } + catch (Tools::IllegalStateException ex) + { + ret = false; + cerr << "Got an error " << ex.what() << endl; } - catch (char *str) + catch (Tools::IllegalArgumentException ex) { - ret = false; - cerr << "Got an error " << str << endl; + ret = false; + cerr << "Got an error " << ex.what() << endl; } delete tree; delete file; delete diskfile; - return(ret); - } + return ret; + } /* ************************************************************************* ** ** ** Function to query shape file. ** - ** + ** ** ** ************************************************************************* */ bool isValidIndexFile(string baseName, int bufferSize) - { + { bool ret = false; - IStorageManager *diskfile; - StorageManager::IBuffer *file; - ISpatialIndex *tree; + IStorageManager *diskfile; + StorageManager::IBuffer *file; + ISpatialIndex *tree; - try + try { diskfile = StorageManager::loadDiskStorageManager(baseName); // this will try to locate and open an already existing storage manager. file = StorageManager::createNewRandomEvictionsBuffer(*diskfile, bufferSize, false); - - tree = RTree::loadRTree(*file, 1); + + tree = RTree::loadRTree(*file, 1); ret = tree->isIndexValid(); } - catch (char *str) + catch (char *str) { - cerr << "Got an error " << str << endl; + cerr << "Got an error " << str << endl; } - delete tree; + delete tree; delete file; delete diskfile; - return ret; - } + return ret; + } /* ************************************************************************* ** ** ** Function to query shape file. ** - ** + ** ** ** ************************************************************************* */ void queryIndexFile(ISpatialIndex *spatialIndex, SpatialIndex::Region queryRegion, QueryTypeFlags queryType, ShapeIdxVisitor *vis) - { - try + { + try { - if (queryType == 1) - spatialIndex->intersectsWithQuery(queryRegion, *vis); - else if (queryType == 2) - spatialIndex->containsWhatQuery(queryRegion, *vis); + if (queryType == 1) + spatialIndex->intersectsWithQuery(queryRegion, *vis); + else if (queryType == 2) + spatialIndex->containsWhatQuery(queryRegion, *vis); } - catch (exception ex) + catch (exception ex) { - cerr << "Error running query on spatial index." << endl; + cerr << "Error running query on spatial index." << endl; } - } + } int selectShapesFromIndex(ISpatialIndex *spatialIndex, double *lowVals, double *hiVals, QueryTypeFlags queryType, CIndexSearching *resulSet) { - int rCode = 0; - - try + int rCode = 0; + + try { - long val; - double xmin, ymin, xmax, ymax; - vector res; - - xmin = (lowVals[0] < hiVals[0]) ? lowVals[0] : hiVals[0]; - ymin = (lowVals[1] < hiVals[1]) ? lowVals[1] : hiVals[1]; - xmax = (lowVals[0] > hiVals[0]) ? lowVals[0] : hiVals[0]; - ymax = (lowVals[1] > hiVals[1]) ? lowVals[1] : hiVals[1]; - - lowVals[0] = xmin; - lowVals[1] = ymin; - hiVals[0] = xmax; - hiVals[1] = ymax; - - Region *queryRegion = new Region(lowVals,hiVals,2); - ShapeIdxVisitor *vis = new ShapeIdxVisitor(); - - queryIndexFile(spatialIndex, *queryRegion, queryType, vis); - - resulSet->setCapacity(vis->ids.size()); - int arrSize = vis->ids.size(); - for (unsigned i = 0; i < vis->ids.size();vis->ids.pop()) + long val; + double xmin, ymin, xmax, ymax; + vector res; + + xmin = (lowVals[0] < hiVals[0]) ? lowVals[0] : hiVals[0]; + ymin = (lowVals[1] < hiVals[1]) ? lowVals[1] : hiVals[1]; + xmax = (lowVals[0] > hiVals[0]) ? lowVals[0] : hiVals[0]; + ymax = (lowVals[1] > hiVals[1]) ? lowVals[1] : hiVals[1]; + + lowVals[0] = xmin; + lowVals[1] = ymin; + hiVals[0] = xmax; + hiVals[1] = ymax; + + Region *queryRegion = new Region(lowVals, hiVals, 2); + ShapeIdxVisitor *vis = new ShapeIdxVisitor(); + + queryIndexFile(spatialIndex, *queryRegion, queryType, vis); + + resulSet->setCapacity(vis->ids.size()); + int arrSize = vis->ids.size(); + for (unsigned i = 0; i < vis->ids.size(); vis->ids.pop()) { - val = (long)vis->ids.front(); - int len = resulSet->getLength(); - resulSet->addValue(val); + val = (long)vis->ids.front(); + int len = resulSet->getLength(); + resulSet->addValue(val); } - delete queryRegion; - delete vis; + delete queryRegion; + delete vis; } - catch (exception ex) + catch (exception ex) { - rCode = -1; + rCode = -1; } - catch (Tools::IllegalStateException ex1) + catch (Tools::IllegalStateException ex1) { - rCode = -1; + rCode = -1; } - catch (Tools::IllegalArgumentException ex2) + catch (Tools::IllegalArgumentException ex2) { - rCode = -1; + rCode = -1; } - catch (...) + catch (...) { - rCode = -1; + rCode = -1; } - return (rCode); + return (rCode); } /* ************************************************************************* ** ** ** Function to query shape file. ** - ** + ** ** ** ************************************************************************* */ void ShapeIdxVisitor::visitData(const IData& d) - { + { // data should be an array of characters representing a Region as a string. byte* pData = 0; @@ -197,16 +211,16 @@ namespace IndexSearching d.getData(cLen, &pData); delete[] pData; - __int64 val; - val = d.getIdentifier(); + __int64 val; + val = d.getIdentifier(); ids.push(val); - } - + } + void ShapeIdxVisitor::visitNode(const INode& n) - { - if (n.isLeaf()) m_leafIO++; + { + if (n.isLeaf()) m_leafIO++; else m_indexIO++; - } + } //08-24-2009 (sm) caching for performance @@ -221,7 +235,7 @@ namespace IndexSearching map::iterator mapIterator = m_cache.find(spatialIndexID); if (mapIterator != m_cache.end()) return (*mapIterator).second.m_tree; - + return NULL; } diff --git a/src/Utilities/SpatialIndex/ShapeFileStream.cpp b/src/Utilities/SpatialIndex/ShapeFileStream.cpp index 0d308fa9..a2e6bf46 100644 --- a/src/Utilities/SpatialIndex/ShapeFileStream.cpp +++ b/src/Utilities/SpatialIndex/ShapeFileStream.cpp @@ -123,7 +123,9 @@ { case 0: // NULL Shape break; - case 1: // Point + case ShpfileType::SHP_POINT: + case ShpfileType::SHP_POINTM: + case ShpfileType::SHP_POINTZ: // Point types m_ShpFile.read((char *)&low[0],sizeof(double)); m_ShpFile.read((char *)&low[1],sizeof(double)); high[0] = low[0]; diff --git a/src/Utilities/UtilityFunctions.cpp b/src/Utilities/UtilityFunctions.cpp index 481b0073..c55fa722 100644 --- a/src/Utilities/UtilityFunctions.cpp +++ b/src/Utilities/UtilityFunctions.cpp @@ -1212,6 +1212,17 @@ namespace Utility { Utility::CPLCreateXMLAttributeAndValue(node, elementName, CPLString().Printf("%d", val->lVal)); } + else if (val->vt == VT_BOOL) + { + Utility::CPLCreateXMLAttributeAndValue(node, elementName, (val->boolVal == VARIANT_TRUE) ? "T" : "F"); + } + else if (val->vt == VT_DATE) + { + CString cval; + COleDateTime dt(val->date); + cval.Format("%4d%2d%2d", dt.GetYear(), dt.GetMonth(), dt.GetDay()); + Utility::CPLCreateXMLAttributeAndValue(node, elementName, cval); + } } // ****************************************************************** @@ -1233,6 +1244,18 @@ namespace Utility var->vt = VT_R8; var->dblVal = Utility::atof_custom(sValue); break; + case BOOLEAN_FIELD: + var->vt = VT_BOOL; + var->boolVal = (sValue[0] == 'T') ? VARIANT_TRUE : VARIANT_FALSE; + case DATE_FIELD: + int m, d, y; + y = atoi(sValue.Mid(0, 4)); + m = atoi(sValue.Mid(4, 2)); + d = atoi(sValue.Mid(6, 2)); + COleDateTime dt(y, m, d, 0, 0, 0); + var->vt = VT_DATE; + var->date = dt; + break; } } diff --git a/src/changingVersionNumbers.txt b/src/changingVersionNumbers.txt index 0415185f..5a8f9246 100644 --- a/src/changingVersionNumbers.txt +++ b/src/changingVersionNumbers.txt @@ -1,8 +1,8 @@ When releasing a new version version numbers need to be updated on several locations: MapWinGIS.rc lines: 114, 115, 133, 139 MapWinGIS.cpp lines: 32, 33 -MapWinGIS.idl line: 6395 (helpfile("MapWinGIS.chm")) - , 6416 (helpstring("Dispatch interface for Map Control")) +MapWinGIS.idl line: 6622 (helpfile("MapWinGIS.chm")) + , 6644 (helpstring("Dispatch interface for Map Control")) If you want to update AxInterop.MapWinGIS.dll and Interop.MapWinGIS.dll you can run the InteropCreator project. It is a C# project which will create the interop dlls for you. diff --git a/support/ShapeLib/AUTHORS b/support/ShapeLib/AUTHORS new file mode 100644 index 00000000..0b0340f5 --- /dev/null +++ b/support/ShapeLib/AUTHORS @@ -0,0 +1,2 @@ +Frank Warmerdam et al. + diff --git a/support/ShapeLib/CMakeLists.txt b/support/ShapeLib/CMakeLists.txt new file mode 100644 index 00000000..c3ef9350 --- /dev/null +++ b/support/ShapeLib/CMakeLists.txt @@ -0,0 +1,237 @@ +# Top-level CMakeLists.txt for the CMake-based build and test system +# of the shapelib software. + +# Copyright (C) 2012-2013 Alan W. Irwin + +# See README.CMake + +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; version 2 of the License. +# +# This file 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 Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this file; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# It is a fatal error if no working C compiler is available to build +# the shapelib library and utilities +project(shapelib C) + +message(STATUS "CMake version = ${CMAKE_VERSION}") +message(STATUS "CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}") + +# Version 2.8.5 or above of cmake is currently required for all platforms. +cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR) + +# libraries are all shared by default. +option(BUILD_SHARED_LIBS "Build shared libraries" ON) + +# Use rpath? +if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + # No rpath on Darwin. Setting it will only cause trouble. +else(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + option(USE_RPATH "Use -rpath when linking libraries, executables" ON) +endif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + +# In windows all created dlls are gathered in the dll directory +# if you add this directory to your PATH all shared libraries are available +if(BUILD_SHARED_LIBS AND WIN32 AND NOT CYGWIN) + set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/dll) +endif(BUILD_SHARED_LIBS AND WIN32 AND NOT CYGWIN) + +set(PACKAGE shp) + +# Set up install locations. +set( + CMAKE_INSTALL_BINDIR + ${CMAKE_INSTALL_PREFIX}/bin + CACHE PATH "install location for user executables" + ) + +set( + CMAKE_INSTALL_LIBDIR + ${CMAKE_INSTALL_PREFIX}/lib + CACHE PATH "install location for object code libraries" + ) + +set( + CMAKE_INSTALL_INCLUDEDIR + ${CMAKE_INSTALL_PREFIX}/include + CACHE PATH "install location for C header files" + ) + +set( + CMAKE_INSTALL_SHP_DATADIR + ${CMAKE_INSTALL_PREFIX}/share/${PACKAGE} + CACHE PATH "install location for read-only architecture-independent shp data" + ) + +# Export build information to help other projects link installed +# shapelib software. Only one of these signatures is required +# for the export_shp name. +install(EXPORT export_shp DESTINATION ${CMAKE_INSTALL_SHP_DATADIR}) + +# Initial boilerplate done, now build library and executables. + +set(lib_SRC + shpopen.c + dbfopen.c + safileio.c + shptree.c + sbnsearch.c + ) +option(SHP_DROP_UNABLE_TO_OPEN_MSG "Drop \"unable to open\" error messages" ON) +if(SHP_DROP_UNABLE_TO_OPEN_MSG) + #define the SHP_DROP_UNABLE_TO_OPEN_MSG C macro for this source file. + set_source_files_properties(shpopen.c + PROPERTIES + COMPILE_DEFINITIONS SHP_DROP_UNABLE_TO_OPEN_MSG + ) +endif(SHP_DROP_UNABLE_TO_OPEN_MSG) + +add_library(shp ${lib_SRC}) + +if(WIN32 AND NOT CYGWIN) + set_target_properties(shp + PROPERTIES + COMPILE_DEFINITIONS SHAPELIB_DLLEXPORT + ) +endif(WIN32 AND NOT CYGWIN) + +if(UNIX) + find_library(M_LIB m) + if(M_LIB) + TARGET_LINK_LIBRARIES(shp -lm) + endif() +endif(UNIX) + +set(shp_SOVERSION 1) +set(shp_VERSION 1.4.1) +set_target_properties(shp + PROPERTIES + SOVERSION ${shp_SOVERSION} + VERSION ${shp_VERSION} + INSTALL_NAME_DIR "${CMAKE_INSTALL_LIBDIR}" + ) + +if(USE_RPATH) + set_target_properties(shp + PROPERTIES + INSTALL_RPATH "${CMAKE_INSTALL_LIBDIR}" + ) +endif(USE_RPATH) + +install(TARGETS shp + EXPORT export_shp + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ) + +# executables to be built and installed. +set(executables + shpcreate + shpadd + shpdump + shprewind + dbfcreate + dbfadd + dbfdump + shptreedump + ) + +find_program(BASH_EXECUTABLE bash) +find_program(SED_EXECUTABLE sed) +if(BASH_EXECUTABLE AND SED_EXECUTABLE) + set(BUILD_TEST ON) +else(BASH_EXECUTABLE AND SED_EXECUTABLE) + message(STATUS "WARNING: sed or bash not available so disabling testing") +endif(BASH_EXECUTABLE AND SED_EXECUTABLE) + +# For the first series of tests, the user needs to have downloaded +# from http://dl.maptools.org/dl/shapelib/shape_eg_data.zip, unpacked +# that file, and specified the location of that directory with +# the cmake option, -DEG_DATA:PATH=whatever +if(BUILD_TEST) + if(EG_DATA) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/script.sed "s?/u/www/projects/shapelib/eg_data?${EG_DATA}?\n") + else(EG_DATA) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/script.sed "") + message(STATUS "WARNING: EG_DATA:PATH not set to point to downloaded eg_data directory so the eg_data part of testing will be ignored.") + endif(EG_DATA) +endif(BUILD_TEST) + +foreach(executable ${executables}) + add_executable(${executable} ${executable}.c) + target_link_libraries(${executable} shp) + if(USE_RPATH) + set_target_properties(${executable} + PROPERTIES + INSTALL_RPATH "${CMAKE_INSTALL_LIBDIR}" + ) + endif(USE_RPATH) + if(BUILD_TEST) + get_target_property(${executable}_LOC ${executable} LOCATION) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/script.sed "s?\\./${executable}?${${executable}_LOC}?\n") + endif(BUILD_TEST) + install(TARGETS ${executable} DESTINATION ${CMAKE_INSTALL_BINDIR}) +endforeach(executable ${executables}) + +# Install header +install(FILES shapefil.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +if(BUILD_TEST) + # Set up tests: + + enable_testing() + + # Other executables to be built to facilitate tests. + foreach(executable shptest shputils) + add_executable(${executable} ${executable}.c) + target_link_libraries(${executable} shp) + get_target_property(${executable}_LOC ${executable} LOCATION) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/script.sed "s?\\./${executable}?${${executable}_LOC}?\n") + endforeach(executable shptest shputils) + + # Write this as a shell script since execute_process cannot handle + # anything like redirection. + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/script.sh "${SED_EXECUTABLE} -f script.sed < $1 >| $2") + execute_process( + COMMAND + ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/script.sh ${CMAKE_CURRENT_SOURCE_DIR}/tests/test1.sh ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test1.sh + ) + + execute_process( + COMMAND + ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/script.sh ${CMAKE_CURRENT_SOURCE_DIR}/tests/test2.sh ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test2.sh + ) + + execute_process( + COMMAND + ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/script.sh ${CMAKE_CURRENT_SOURCE_DIR}/tests/test3.sh ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test3.sh + ) + + if(EG_DATA) + # These tests correspond to everything in test1.sh + add_test( + NAME test1 + COMMAND ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test1.sh + ) + endif(EG_DATA) + # These tests correspond to everything in test2.sh + add_test( + NAME test2 + COMMAND ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test2.sh + ) + + # These tests correspond to everything in test3.sh + add_test( + NAME test3 + COMMAND ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test3.sh + ) +endif(BUILD_TEST) diff --git a/support/ShapeLib/COPYING b/support/ShapeLib/COPYING new file mode 100644 index 00000000..0b643ac8 --- /dev/null +++ b/support/ShapeLib/COPYING @@ -0,0 +1,483 @@ + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, 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 library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + 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 Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, 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 or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the 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 a program 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. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + 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, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +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 compile 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) 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. + + c) 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. + + d) 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 source code 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 to +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 Library 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 + + Appendix: 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 Library General Public + License as published by the Free Software Foundation; either + version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 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/support/ShapeLib/ChangeLog b/support/ShapeLib/ChangeLog new file mode 100644 index 00000000..e8fbde5b --- /dev/null +++ b/support/ShapeLib/ChangeLog @@ -0,0 +1,528 @@ +2017-09-10 Even Rouault + + * shpopen.c: resync with GDAL copy. Make sure to zero terminate all + error messages. And fix regression regarding re-writing the last shape + of a file (https://trac.osgeo.org/gdal/ticket/7031) + +2017-07-10 Even Rouault + + * contrib/shpgeo.c: fix compilation on _MSC_VER < 1800 regarding lack + of NAN macro. + +2016-12-09 Even Rouault + + * Makefile.am: add web/maptools.css to EXTRA_DIST + + * Shapelib 1.4.0 released + +2016-12-06 Even Rouault + + * configure.ac: change soname to 2:1:0 to be in sync with Debian soname. + http://bugzilla.maptools.org/show_bug.cgi?id=2628 + Patch by Bas Couwenberg + + * contrib/doc/Shape_PointInPoly_README.txt, contrib/shpgeo.c: typo fixes. + http://bugzilla.maptools.org/show_bug.cgi?id=2629 + Patch by Bas Couwenberg + + * web/*: use a local .css file to avoid a privacy breach issue reported + by the lintian QA tool. + http://bugzilla.maptools.org/show_bug.cgi?id=2630 + Patch by Bas Couwenberg + +2016-12-06 Even Rouault + + * web/release.html, HOWTO-RELEASE, configure.ac, CMakeLists.txt: prepare + for 1.4.0 release. + +2016-12-05 Even Rouault + + * dbfopen.c, shapefil.h: write DBF end-of-file character 0x1A by default. + This behaviour can be controlled with the DBFSetWriteEndOfFileChar() + function. + +2016-12-05 Even Rouault + + * Major overhaul of Makefile build system to use autoconf/automake. + Contributed by Sandro Mani: https://github.com/manisandro/shapelib/tree/autotools + + * Warning fixes in contrib/ + +2016-12-04 Even Rouault + + * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with + GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo + structures extended with new members. New functions: + DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, + SHPSetFastModeReadObject + + * sbnsearch.c: new file to implement original ESRI .sbn spatial + index reading. (no write support). New functions: + SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, + SBNSearchDiskTreeInteger, SBNSearchFreeIds + + * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates + with new file and symbols. + + * commit: helper script to cvs commit + +2013-11-26 Frank Warmerdam + + * CMakeLists.txt: CMake support from Alan W. Irwin. + + * dbfdump.c: untested reporting for deleted records. + +2012-04-10 Frank Warmerdam + + * Shapelib 1.3.0 released. + +2012-01-27 Frank Warmerdam + + * shptree.c: optimize quadtree generation (gdal #4472) + +2012-01-24 Frank Warmerdam + + * shpopen.c: fix memory leaks on failure to open .shp file. + +2011-12-11 Frank Warmerdam + + * shptree.c,h: Use SAHooks for .qix access (gdal #3365) + +2011-09-14 Frank Warmerdam + + * shpopen.c: fix missing cast (#2344) + +2011-07-24 + + * shpopen.c, dbfopen.c, shptree.c, shapefil.h: Minimize use of + CPL services in favor of SAHooks.Error(). + + * Makefile: Remove all the shared library building stuff, it is just + too half assed, and results in all sorts of bug reports and complaints. + Instead just install a static libshp.a. + +2011-07-23 + + * Makefile: build shpdumptree as part of all target (#1648). + + * shpopen.c: fix memory leaks in error cases (#2061) + + * contrib/*.c: Include stdlib.h and strings.h (#2146) + + * shpdump.c: change to use %.15g for coordinate reporting. (#2277) + +2011-05-13 Frank Warmerdam + + * dbfopen.c, shapelib.h: Add functions to reorder and alter + field definitions. DBFReorderFields() and DBFAlterFields(). + +2011-05-07 Frank Warmerdam + + * dbfopen.c: Ensure pending record is flushed when adding a native + field (gdal #4073). + +2011-04-16 Frank Warmerdam + + * shapefil.h: avoid warnings with SHP_CVSID on gcc. + +2010-12-06 Frank Warmerdam + + * dbfopen.c: fix read past end of init data fetching code page + http://bugzilla.maptools.org/show_bug.cgi?id=2276 + +2010-07-01 Frank Warmerdam + + * shpopen.c: do not error out on a shape with zero vertices. + + * shpdump.c: do not crash if null shape returned by read object. + +2010-06-29 Frank Warmerdam + + * shptree.c: fix sign of Z and M comparisons in SHPCheckObjectContained. + (http://bugzilla.maptools.org/show_bug.cgi?id=2223) + +2010-01-28 Frank Warmerdam + + * shpopen.c/shapefil.h: Handle the .shp file length limits more + gracefully. (http://trac.osgeo.org/gdal/ticket/3236) + + * shpopen.c: Improve the numerical accurancy of algorithms in + SHPRewind() (http://trac.osgeo.org/gdal/ticket/3363). + +2010-01-16 Frank Warmerdam + + * shpopen.c: support passing in zero/nulls to create an empty + SHPObject: http://bugzilla.maptools.org/show_bug.cgi?id=2148 + +2009-10-29 Frank Warmerdam + + * dbfopen.c: avoid crash risk for truncated files. + http://trac.osgeo.org/gdal/ticket/3093 + +2009-09-17 Bram de Greve + + * shpopen.c: on Win32, define snprintf as alias to _snprintf + +2008-11-12 Frank Warmerdam + + * shptree.c: improve safety in face of buggy .shp file. + http://trac.osgeo.org/gdal/ticket/2610 + + * dbfopen.c: DBFCreateField() can now also operate on files with + records, c/o Martin Dobias. + https://trac.osgeo.org/gdal/ticket/2672 + +2008-11-11 Frank Warmerdam + + * dbfopen.c: Introduce DBFDeleteField() function from Martin Dobias. + http://trac.osgeo.org/gdal/ticket/2671 + +2008-03-14 Frank Warmerdam + + * Correct crash on buggy geometries (Even Rouault). + http://trac.osgeo.org/gdal/ticket/2218 + +2008-01-16 Bram de Greve + + * shapefil.h, safileio.c: add file hooks that accept UTF-8 + encoded filenames on some platforms. Use SASetupUtf8Hooks + to setup the hooks and check SHPAPI_UTF8_HOOKS for its + availability. Currently, this is only available on the Windows + platform that decodes the UTF-8 filenames to wide character + strings and feed them to _wfopen and _wremove. + +2008-01-10 Frank Warmerdam + + * shapefil.h: Avoid _ prefix on #defines. + http://bugzilla.maptools.org/show_bug.cgi?id=1840 + +2008-01-03 Bram de Greve + + * dbfopen.c: in DBFCreate, use default code page + LDID/87 (= 0x57, ANSI) instead of LDID/3. This seems + to be the same as what ESRI would be doing by default. + +2007-12-30 Frank Warmerdam + + * shpadd.c/shpcreate.c: Add support for z and m files. + + * Massive overhaul to use hooks for file io, etc. + +2007-12-18 Bram de Greve + + * dbfopen.c/shapefil.h/safileio.c: create hook for client + specific atof http://bugzilla.maptools.org/show_bug.cgi?id=1615 + + * dbfopen.c: check for NULL handle before closing cpCPG file, + and close after reading. + +2007-12-15 Bram de Greve + + * dbfopen.c/shapefil.h/safileio.c: read the Code Page information + from the DBF file, and exports this information as a string through + the DBFGetCodePage function. This is either the number from the LDID + header field ("LDID/") or as the content of an accompanying + .CPG file. When creating a DBF file, the code can be set using + DBFCreateEx. + +2007-12-12 Bram de Greve + + * dbfopen.c: check for NULL handle in DBFClose. + +2007-11-21 Frank Warmerdam + + * shpopen.c/shapefil.h: Don't keep .shx file open in read-only mode. + http://trac.osgeo.org/gdal/ticket/1956 + +2007-11-14 Frank Warmerdam + + * shpopen.c: checks after mallocs to detect for corrupted/voluntary + broken shapefiles. http://trac.osgeo.org/gdal/ticket/1991 + +2007-09-03 Frank Warmerdam + + * shpgeo.c: Fixed SHPDimension() (missing breaks) in shpgeo.c. + Fix contributed by Andrea Peri. + + * dbfopen.c: Move the static dDoubleField return buffer into DBFInfo + structure to avoid multithreaded risks. + + * dbfopen.c: Simplify DBFReadTuple() to avoid use of static tuple. + Note that this means DBFReadTuple() results are only valid till the + next record is read for any reason. + +2007-06-21 Frank Warmerdam + + * shpopen.c: Fix for SHPRewind() for "contact at one vertex" + cases in rings. http://trac.osgeo.org/gdal/ticket/976 + +2006-11-06 Frank Warmerdam + + * contrib/shpgeo.c: Modified SHPProject to use pj_transform() so + it works for datums and stuff. Submitted by Steffen Macke. + +2006-09-04 Frank Warmerdam + + * shpeopen.c: (MLoskot) Added stronger test of Shapefile reading + failures, e.g. truncated files. The problem was discovered by Tim + Sutton and reported here: + https://svn.qgis.org/trac/ticket/200 + +2006-06-17 Frank Warmerdam + + * dbfopen.c: use calloc() for DBFInfo in DBFCreate() to ensure + all fields initialized to zero if not otherwise mentioned. + + * dbfopen.c: Don't allow creation of string fields with width larger + than 255 per http://bugzilla.maptools.org/show_bug.cgi?id=1434 + +2006-06-16 Frank Warmerdam + + * dbfopen.c: Don't treat decimals value as high order field length + for strings, as it causes serious bugs in some cases such as + http://bugzilla.remotesensing.org/show_bug.cgi?id=1202 + + * dbfopen.c: Made static field buffer in DBFReadAttribute() into a + field in the DBFInfo structure to avoid multi-threading problems. + +2006-03-29 Frank Warmerdam + + * dbfopen.c: Fixed bug in DBFCloneEmpty() (treating pachFieldType as + an array of int). + +2006-02-08 Frank Warmerdam + + * dbfopen.c: Changed to put spaces into string fields that are NULL + as per http://bugzilla.maptools.org/show_bug.cgi?id=316. + +2006-01-26 Frank Warmerdam + + * shpopen.c, shapefil.h, shpdump.c: Added bMeasureIsUsed support as + per http://bugzilla.maptools.org/show_bug.cgi?id=1249 + +2006-01-04 Frank Warmerdam + + * dbfopen.c/shapefil.h: Added functions to check if dbf record is + deleted, and to mark it as deleted. + +2005-02-11 Frank Warmerdam + + * shpopen.c: Check panPartStart[0] is 0 in SHPCreateObject(). + + * Fixed bug 305 in DBFCloneEmpty() - header length problem. + + * Make the pszStringField buffer for DBFReadAttribute() static char + [256] as per bug 306. + +2004-09-15 Frank Warmerdam + + * dbfopen.c: treat all blanks as NULL in DBFIsAttributeNULL(). + +2004-06-23 Frank Warmerdam + + * contrib/shpsort.c: added new contribute program from Eric Miller. + +2003-04-07 Frank Warmerdam + + * Issue 1.2.10 Release. + +2003-03-10 Frank Warmerdam + + * dbfopen.c: modified DBFWriteAttribute call so that it returns FALSE + if it has to truncate the input value. + +2003-01-28 Frank Warmerdam + + * shptree.c: avoid build warnings. + +2002-05-07 Frank Warmerdam + + * dbfopen.c: Added DBFWriteAttributeDirectly() from the AVCE00 + distribution to simplify AVC integration in GDAL. + + * shptree.c: added use of qsort() in place of bubble sort as + submitted by Bernhard Herzog. + +2002-04-10 Frank Warmerdam + + * shpopen.c: Added SHPRewindObject() to correct ring winding. + + * shprewind.c: New utility program. + +2002-03-12 Frank Warmerdam + + * shapelib.def: added DBFWriteNULLAttribute. + +2002-01-17 Frank Warmerdam + + * contrib/ShapeFileII.pas: Contributed Delphi Pascal interface + to Shapelib. + +2002-01-15 Frank Warmerdam + + * shapelib.h: Added support for SHAPELIB_DLLEXPORT macro, and write + up material attempting to explain the use of SHPAPI_CALL macros. + + * dbfopen.c: Compute nHeaderLength in DBFCloneEmpty() instead of + copying it from the source file so we don't have quirks when copying + from files with extra bytes of spacers in the header that don't + themselves get copied properly. + +2001-12-07 Frank Warmerdam + + * shpopen.c: Fix fclose() of SHX file if SHX file fails to open. + Should be closing SHP file. Reported by Ben Discoe. + +2001-11-28 Frank Warmerdam + + * dbfopen.c: two fixes for compiler warnings as suggested by + Richard Hash. + +2001-11-01 Frank Warmerdam + + * shpopen.c/shapefil.h: Move record buffer into SHPInfo so that + different threads can safely access separate files. Other threading + issues may remain. + +2001-08-28 Frank Warmerdam + + * Issue Shapelib 1.2.9 + + * shputils.c: DBFAddField() call should check for -1 return value + for failure. + +2001-07-03 Frank Warmerdam + + * shpopen.c: cleanup better if SHX missing, provided by + Riccardo Cohen. + +2001-06-21 Frank Warmerdam + + * dbfopen.c: Fixed NULL support with patches from Jim Matthews. + + * shpopen.c: Be more careful of establishing initial file bounds in + face of possible NULL shapes. + +2001-06-01 Frank Warmerdam + + * dbfopen.c: ensure binary mode open. + +2001-05-31 Frank Warmerdam + + * shpopen.c: Add support for writing null shapes. + + * dbfopen.c: added DBFGetFieldIndex(), contributed by Jim Matthews. + + * dbfopen.c/shapefil.h/dbf_api.h: added support for NULL fields + in .dbf files. + +2001-05-28 Frank Warmerdam + + * shpopen.c: add some checking on the record count to ensure it + is reasonable. + +2001-05-23 Frank Warmerdam + + * shapefile.h, shpopen.c, dbfopen.c, shptree.c: added the SHPAPI_CALL + macro to allow compilation with _stdcall conventions. + +2001-02-06 Frank Warmerdam + + * Fixed a few memory leaks when SHPOpen() fails. + +2000-12-05 Frank Warmerdam + + * Fix from Craig Bruce (Cubewerx) for DBFReadAttribute() for + the white space trimming code to avoid reading outside allocated + memory. + +2000-11-02 Frank Warmerdam + + * Checked in upgraded shputils.c from Bill Miller. + +2000-10-05 Frank Warmerdam + + * Fixed DBFWriteAttribute() to ensure we can't overwrite the + end of the szSField buffer even if the width is set large. + Bug report by Kirk Benell . + +2000-09-25 Frank Warmerdam + + * Added DBFGetNativeFieldType() (contributed by Daniel) to dbfopen.c. + +2000-07-18 Frank Warmerdam + + * added better enforcement of -1 for append in SHPWriteObject(). + +2000-07-07 Frank Warmerdam + + * Added stdlib.h and string.h where needed, and removed lots of + unused variables, mainly from example mainlines at the suggestion + of Bill Hughes. + +2000-05-24 Frank Warmerdam + + * Added logic to shpadd to grow vertex lists at the suggestion of + Santiago Nullo . + +2000-05-23 Frank Warmerdam + + * Added checks in dbfopen.c on return result of fseek() and fread(). + + * Avoid crashing in DBReadIntegerAttribute() or DBFReadDoubleAttribte() + if the field or record are out of range. + +2000-03-28 Frank Warmerdam + + * Release as 1.2.8. + + * Incorporated a -version-info fix and added mkinstalldirs from Jan. + +2000-03-17 Frank Warmerdam + + * Added shared library hack to Makefile. + + * Fixed up test scripts to look in ./ for executables. + +Wed Feb 16 11:20:29 2000 Frank Warmerdam + + * Release 1.2.7. + + * Modified SHPReadObject() so that will return NULL (type 0) shapes + in a sort of sensible way. + +Wed Dec 15 08:49:53 1999 Frank Warmerdam + + * Fixed record size written at beginning of records in .shp + file. It was 4 bytes to long (thanks to Mikko Syrja of 3D-system Oy) + + * Use atof() instead of sscanf() in dbfopen.c, and add stdlib.h. + +Mon Dec 13 12:29:01 1999 Frank Warmerdam + + * Added support for uppercase .DBF extention c/o + Dennis Christopher + +Fri Nov 5 09:12:31 1999 Frank Warmerdam + + * Updated license headers to include the option of use of the code + under the LGPL. + +1999-09-15 + + * Added shapelib.dll target to makefile.vc. + +Mon May 10 23:19:42 1999 Frank Warmerdam + + * Added candrsn's improvements to extension handling in dbfopen.c + + * Added ``raw tuple'' api to dbfopen.c, still not in dbf_api.html. + From candrsn. + + +Tue May 4 11:04:31 1999 Frank Warmerdam + + * Prepare 1.2.5 release. + + * Added support for 'F' fields. + diff --git a/support/ShapeLib/INSTALL b/support/ShapeLib/INSTALL new file mode 100644 index 00000000..20998407 --- /dev/null +++ b/support/ShapeLib/INSTALL @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell command `./configure && make && make install' +should configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. diff --git a/support/ShapeLib/Makefile.am b/support/ShapeLib/Makefile.am new file mode 100644 index 00000000..2d22cc68 --- /dev/null +++ b/support/ShapeLib/Makefile.am @@ -0,0 +1,76 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = . contrib + +ACLOCAL_AMFLAGS = -I m4 +AUTOMAKE_OPTIONS = dist-zip + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif + +# Extra files to distribute in the source tarball +EXTRA_DIST = makefile.vc CMakeLists.txt autogen.sh \ + tests/test1.sh tests/test2.sh tests/test3.sh \ + tests/stream1.out tests/stream1.out tests/stream1.out \ + web/maptools.css \ + web/codepage.html \ + web/index.html \ + web/shapelib-tools.html \ + web/shp_api.html \ + web/release.html \ + web/dbf_api.html \ + web/license.html \ + web/manifest.html \ + README.tree README.CMake + +# pkg-config file +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = shapelib.pc + +# Library +lib_LTLIBRARIES = libshp.la +libshp_la_includedir = $(includedir) +libshp_la_include_HEADERS = shapefil.h +libshp_la_SOURCES = shpopen.c dbfopen.c safileio.c shptree.c sbnsearch.c +libshp_la_LDFLAGS = -version-info $(SHAPELIB_SO_VERSION) $(no_undefined) $(LIBM) + +# Installed executables +bin_PROGRAMS = dbfadd dbfcreate dbfdump shpadd shpcreate shpdump shprewind shptreedump shputils + +dbfadd_SOURCES = dbfadd.c +dbfadd_LDADD = $(top_builddir)/libshp.la + +dbfcreate_SOURCES = dbfcreate.c +dbfcreate_LDADD = $(top_builddir)/libshp.la + +dbfdump_SOURCES = dbfdump.c +dbfdump_LDADD = $(top_builddir)/libshp.la + +shpadd_SOURCES = shpadd.c +shpadd_LDADD = $(top_builddir)/libshp.la + +shpcreate_SOURCES = shpcreate.c +shpcreate_LDADD = $(top_builddir)/libshp.la + +shpdump_SOURCES = shpdump.c +shpdump_LDADD = $(top_builddir)/libshp.la + +shprewind_SOURCES = shprewind.c +shprewind_LDADD = $(top_builddir)/libshp.la + +shptreedump_SOURCES = shptreedump.c +shptreedump_LDADD = $(top_builddir)/libshp.la + +shputils_SOURCES = shputils.c +shputils_LDADD = $(top_builddir)/libshp.la + +# Non-installed executables +noinst_PROGRAMS = shptest +shptest_SOURCES = shptest.c +shptest_LDADD = $(top_builddir)/libshp.la + +# Tests +TESTS_ENVIRONMENT = top_builddir=$(abs_top_builddir) +# tests/test1.sh requires ftp://gdal.velocet.ca/pub/outgoing/shape_eg_data.zip +TESTS = tests/test2.sh tests/test3.sh diff --git a/support/ShapeLib/Makefile.in b/support/ShapeLib/Makefile.in new file mode 100644 index 00000000..39629e8c --- /dev/null +++ b/support/ShapeLib/Makefile.in @@ -0,0 +1,1558 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 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@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@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@ +bin_PROGRAMS = dbfadd$(EXEEXT) dbfcreate$(EXEEXT) dbfdump$(EXEEXT) \ + shpadd$(EXEEXT) shpcreate$(EXEEXT) shpdump$(EXEEXT) \ + shprewind$(EXEEXT) shptreedump$(EXEEXT) shputils$(EXEEXT) +noinst_PROGRAMS = shptest$(EXEEXT) +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(libshp_la_include_HEADERS) \ + $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = shapelib.pc +CONFIG_CLEAN_VPATH_FILES = +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 = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(pkgconfigdir)" \ + "$(DESTDIR)$(libshp_la_includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libshp_la_LIBADD = +am_libshp_la_OBJECTS = shpopen.lo dbfopen.lo safileio.lo shptree.lo \ + sbnsearch.lo +libshp_la_OBJECTS = $(am_libshp_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libshp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libshp_la_LDFLAGS) $(LDFLAGS) -o $@ +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +am_dbfadd_OBJECTS = dbfadd.$(OBJEXT) +dbfadd_OBJECTS = $(am_dbfadd_OBJECTS) +dbfadd_DEPENDENCIES = $(top_builddir)/libshp.la +am_dbfcreate_OBJECTS = dbfcreate.$(OBJEXT) +dbfcreate_OBJECTS = $(am_dbfcreate_OBJECTS) +dbfcreate_DEPENDENCIES = $(top_builddir)/libshp.la +am_dbfdump_OBJECTS = dbfdump.$(OBJEXT) +dbfdump_OBJECTS = $(am_dbfdump_OBJECTS) +dbfdump_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpadd_OBJECTS = shpadd.$(OBJEXT) +shpadd_OBJECTS = $(am_shpadd_OBJECTS) +shpadd_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpcreate_OBJECTS = shpcreate.$(OBJEXT) +shpcreate_OBJECTS = $(am_shpcreate_OBJECTS) +shpcreate_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpdump_OBJECTS = shpdump.$(OBJEXT) +shpdump_OBJECTS = $(am_shpdump_OBJECTS) +shpdump_DEPENDENCIES = $(top_builddir)/libshp.la +am_shprewind_OBJECTS = shprewind.$(OBJEXT) +shprewind_OBJECTS = $(am_shprewind_OBJECTS) +shprewind_DEPENDENCIES = $(top_builddir)/libshp.la +am_shptest_OBJECTS = shptest.$(OBJEXT) +shptest_OBJECTS = $(am_shptest_OBJECTS) +shptest_DEPENDENCIES = $(top_builddir)/libshp.la +am_shptreedump_OBJECTS = shptreedump.$(OBJEXT) +shptreedump_OBJECTS = $(am_shptreedump_OBJECTS) +shptreedump_DEPENDENCIES = $(top_builddir)/libshp.la +am_shputils_OBJECTS = shputils.$(OBJEXT) +shputils_OBJECTS = $(am_shputils_OBJECTS) +shputils_DEPENDENCIES = $(top_builddir)/libshp.la +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libshp_la_SOURCES) $(dbfadd_SOURCES) $(dbfcreate_SOURCES) \ + $(dbfdump_SOURCES) $(shpadd_SOURCES) $(shpcreate_SOURCES) \ + $(shpdump_SOURCES) $(shprewind_SOURCES) $(shptest_SOURCES) \ + $(shptreedump_SOURCES) $(shputils_SOURCES) +DIST_SOURCES = $(libshp_la_SOURCES) $(dbfadd_SOURCES) \ + $(dbfcreate_SOURCES) $(dbfdump_SOURCES) $(shpadd_SOURCES) \ + $(shpcreate_SOURCES) $(shpdump_SOURCES) $(shprewind_SOURCES) \ + $(shptest_SOURCES) $(shptreedump_SOURCES) $(shputils_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-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 \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(pkgconfig_DATA) +HEADERS = $(libshp_la_include_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope check recheck distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/shapelib.pc.in \ + AUTHORS COPYING ChangeLog INSTALL NEWS README ar-lib compile \ + config.guess config.sub depcomp install-sh ltmain.sh missing \ + test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).zip +GZIP_ENV = --best +DIST_TARGETS = dist-gzip dist-zip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROJ_CFLAGS = @PROJ_CFLAGS@ +PROJ_LIBS = @PROJ_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPELIB_SO_VERSION = @SHAPELIB_SO_VERSION@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +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@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = . contrib +ACLOCAL_AMFLAGS = -I m4 +AUTOMAKE_OPTIONS = dist-zip +@PLATFORM_WIN32_TRUE@no_undefined = -no-undefined + +# Extra files to distribute in the source tarball +EXTRA_DIST = makefile.vc CMakeLists.txt autogen.sh \ + tests/test1.sh tests/test2.sh tests/test3.sh \ + tests/stream1.out tests/stream1.out tests/stream1.out \ + web/maptools.css \ + web/codepage.html \ + web/index.html \ + web/shapelib-tools.html \ + web/shp_api.html \ + web/release.html \ + web/dbf_api.html \ + web/license.html \ + web/manifest.html \ + README.tree README.CMake + + +# pkg-config file +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = shapelib.pc + +# Library +lib_LTLIBRARIES = libshp.la +libshp_la_includedir = $(includedir) +libshp_la_include_HEADERS = shapefil.h +libshp_la_SOURCES = shpopen.c dbfopen.c safileio.c shptree.c sbnsearch.c +libshp_la_LDFLAGS = -version-info $(SHAPELIB_SO_VERSION) $(no_undefined) $(LIBM) +dbfadd_SOURCES = dbfadd.c +dbfadd_LDADD = $(top_builddir)/libshp.la +dbfcreate_SOURCES = dbfcreate.c +dbfcreate_LDADD = $(top_builddir)/libshp.la +dbfdump_SOURCES = dbfdump.c +dbfdump_LDADD = $(top_builddir)/libshp.la +shpadd_SOURCES = shpadd.c +shpadd_LDADD = $(top_builddir)/libshp.la +shpcreate_SOURCES = shpcreate.c +shpcreate_LDADD = $(top_builddir)/libshp.la +shpdump_SOURCES = shpdump.c +shpdump_LDADD = $(top_builddir)/libshp.la +shprewind_SOURCES = shprewind.c +shprewind_LDADD = $(top_builddir)/libshp.la +shptreedump_SOURCES = shptreedump.c +shptreedump_LDADD = $(top_builddir)/libshp.la +shputils_SOURCES = shputils.c +shputils_LDADD = $(top_builddir)/libshp.la +shptest_SOURCES = shptest.c +shptest_LDADD = $(top_builddir)/libshp.la + +# Tests +TESTS_ENVIRONMENT = top_builddir=$(abs_top_builddir) +# tests/test1.sh requires ftp://gdal.velocet.ca/pub/outgoing/shape_eg_data.zip +TESTS = tests/test2.sh tests/test3.sh +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu 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) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): +shapelib.pc: $(top_builddir)/config.status $(srcdir)/shapelib.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libshp.la: $(libshp_la_OBJECTS) $(libshp_la_DEPENDENCIES) $(EXTRA_libshp_la_DEPENDENCIES) + $(AM_V_CCLD)$(libshp_la_LINK) -rpath $(libdir) $(libshp_la_OBJECTS) $(libshp_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +dbfadd$(EXEEXT): $(dbfadd_OBJECTS) $(dbfadd_DEPENDENCIES) $(EXTRA_dbfadd_DEPENDENCIES) + @rm -f dbfadd$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dbfadd_OBJECTS) $(dbfadd_LDADD) $(LIBS) + +dbfcreate$(EXEEXT): $(dbfcreate_OBJECTS) $(dbfcreate_DEPENDENCIES) $(EXTRA_dbfcreate_DEPENDENCIES) + @rm -f dbfcreate$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dbfcreate_OBJECTS) $(dbfcreate_LDADD) $(LIBS) + +dbfdump$(EXEEXT): $(dbfdump_OBJECTS) $(dbfdump_DEPENDENCIES) $(EXTRA_dbfdump_DEPENDENCIES) + @rm -f dbfdump$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dbfdump_OBJECTS) $(dbfdump_LDADD) $(LIBS) + +shpadd$(EXEEXT): $(shpadd_OBJECTS) $(shpadd_DEPENDENCIES) $(EXTRA_shpadd_DEPENDENCIES) + @rm -f shpadd$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpadd_OBJECTS) $(shpadd_LDADD) $(LIBS) + +shpcreate$(EXEEXT): $(shpcreate_OBJECTS) $(shpcreate_DEPENDENCIES) $(EXTRA_shpcreate_DEPENDENCIES) + @rm -f shpcreate$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpcreate_OBJECTS) $(shpcreate_LDADD) $(LIBS) + +shpdump$(EXEEXT): $(shpdump_OBJECTS) $(shpdump_DEPENDENCIES) $(EXTRA_shpdump_DEPENDENCIES) + @rm -f shpdump$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpdump_OBJECTS) $(shpdump_LDADD) $(LIBS) + +shprewind$(EXEEXT): $(shprewind_OBJECTS) $(shprewind_DEPENDENCIES) $(EXTRA_shprewind_DEPENDENCIES) + @rm -f shprewind$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shprewind_OBJECTS) $(shprewind_LDADD) $(LIBS) + +shptest$(EXEEXT): $(shptest_OBJECTS) $(shptest_DEPENDENCIES) $(EXTRA_shptest_DEPENDENCIES) + @rm -f shptest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shptest_OBJECTS) $(shptest_LDADD) $(LIBS) + +shptreedump$(EXEEXT): $(shptreedump_OBJECTS) $(shptreedump_DEPENDENCIES) $(EXTRA_shptreedump_DEPENDENCIES) + @rm -f shptreedump$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shptreedump_OBJECTS) $(shptreedump_LDADD) $(LIBS) + +shputils$(EXEEXT): $(shputils_OBJECTS) $(shputils_DEPENDENCIES) $(EXTRA_shputils_DEPENDENCIES) + @rm -f shputils$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shputils_OBJECTS) $(shputils_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfadd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfcreate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfdump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfopen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safileio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sbnsearch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpadd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpcreate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpdump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpopen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shprewind.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shptest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shptree.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shptreedump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shputils.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-libshp_la_includeHEADERS: $(libshp_la_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(libshp_la_include_HEADERS)'; test -n "$(libshp_la_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libshp_la_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libshp_la_includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libshp_la_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(libshp_la_includedir)" || exit $$?; \ + done + +uninstall-libshp_la_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(libshp_la_include_HEADERS)'; test -n "$(libshp_la_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(libshp_la_includedir)'; $(am__uninstall_files_from_dir) + +# 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. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + 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; \ + ($(am__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" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + 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 || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +tests/test2.sh.log: tests/test2.sh + @p='tests/test2.sh'; \ + b='tests/test2.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tests/test3.sh.log: tests/test3.sh + @p='tests/test3.sh'; \ + b='tests/test3.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +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 "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$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 \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -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__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_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) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(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 \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_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: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { 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 + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(libshp_la_includedir)"; 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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-libshp_la_includeHEADERS \ + install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ + uninstall-libshp_la_includeHEADERS uninstall-pkgconfigDATA + +.MAKE: $(am__recursive_targets) check-am install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-TESTS check-am clean clean-binPROGRAMS \ + clean-cscope clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + 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-libLTLIBRARIES \ + install-libshp_la_includeHEADERS install-man install-pdf \ + install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ + uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-libLTLIBRARIES uninstall-libshp_la_includeHEADERS \ + uninstall-pkgconfigDATA + +.PRECIOUS: Makefile + + +# 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/support/ShapeLib/NEWS b/support/ShapeLib/NEWS new file mode 100644 index 00000000..70ba85d3 --- /dev/null +++ b/support/ShapeLib/NEWS @@ -0,0 +1,2 @@ +See ChangeLog + diff --git a/support/ShapeLib/PostBuildCopy.bat b/support/ShapeLib/PostBuildCopy.bat new file mode 100644 index 00000000..60178b2f --- /dev/null +++ b/support/ShapeLib/PostBuildCopy.bat @@ -0,0 +1,2 @@ +copy shapefil.h ..\include\ShapeLib +copy shapelib.lib ..\lib\v120\Win32 diff --git a/support/ShapeLib/README b/support/ShapeLib/README new file mode 100644 index 00000000..81af4b18 --- /dev/null +++ b/support/ShapeLib/README @@ -0,0 +1,25 @@ + +Building on Unix +---------------- + +1) run ./configure to generate build scripts + Note: type ./configure --help for a list of fine-tuning options + +2) type "make" + +3) type "make check" to perform self-tests + +4) type "make install" to install + + +Building on Windows +------------------- + +If you have run the VC++ VCVARS32.BAT, you should be able to type the +following in a command window to build the code and executables: + +C:> nmake /f makefile.vc + +Otherwise create your own VC++ project. There aren't many files to deal with +here! + diff --git a/support/ShapeLib/README.CMake b/support/ShapeLib/README.CMake new file mode 100644 index 00000000..de3ff242 --- /dev/null +++ b/support/ShapeLib/README.CMake @@ -0,0 +1,63 @@ +The CMakeLists.txt file in the current directory is a complete build +system for shapelib which does everything that the shapelib Makefile +does and Linux and the shapelib makefile.vc file does on Windows with +a lot more flexibility. For example, full testing can be done with +the present CMake-based approach because an optional and configurable +location is used for the downloadable (for example, wget +http://dl.maptools.org/dl/shapelib/shape_eg_data.zip) eg_data tree +that is used for all the "stream1" tests. + +To use this build system on Unix or MinGW/MSYS/Windows: + +(1) (Optional) Download eg_data from the location above. + +(2) Download shapelib-1.3.0.tar.gz from http://download.osgeo.org/shapelib +and unpack it + +(3) Copy the CMakeLists.txt file into the top-level of the unpacked +shapelib-1.3.0 source tree. + +(4) Apply shapelib.patch (which optionally quiets error messages when +shapelib is unable to open shapefiles). First change directory +to the top-level of the shapelib-1.3.0 source tree, then + +patch -p1 < + +(5) Create a separate empty build tree and use it to configure, build, +install and test shapelib. For example (you will need to tailor the +compiler, compile options, install prefix, eg_data location, and source tree location to your own +needs): + +mkdir build_dir +cd build_dir + +# Configure with the compiler and compiler options of your choice. +# N.B. the gcc -fvisibility=hidden option not (yet) supported by shapelib. +env CC=gcc CFLAGS="-O3 -Wuninitialized" \ +cmake \ +-G "Unix Makefiles" \ +-DCMAKE_INSTALL_PREFIX=/home/software/shapelib/install \ +-DEG_DATA:PATH=/home/software/shapefile/eg_data/ \ +../shapelib-1.3.0 >& cmake.out + +# Build and install +make VERBOSE=1 -j4 install >& install.out + +# Test +ctest + +The -DEG_DATA:PATH option is optional, but if you don't specify +the eg_data directory that way the stream1 tests will be dropped. + +Note the above procedure is what you should do on a Unix platform like +Linux where the generator -G "Unix Makefiles" works well. On +MINGW/MSYS the procedure is essentially the same except you should use +the -G "MSYS Makefiles" cmake option instead to specify a good generator +for that platform. + +I have used variants of the above procedure to create, test, and +install shapelib on both the Linux and MinGW/MSYS/Wine platforms. +Furthermore, on both platforms I have built and tested PLplot using +the installed versions created by the above procedure. No issues were +discovered with PLplot example 19 (which demos PLplot map capabilities with +map shapefiles) for these two separate platform tests. diff --git a/support/ShapeLib/README.tree b/support/ShapeLib/README.tree new file mode 100644 index 00000000..434c6481 --- /dev/null +++ b/support/ShapeLib/README.tree @@ -0,0 +1,172 @@ +Venkat, + +I have completed the planned Shapefile quadtree mechanism. The additions +to the traditional Shapelib are found in shptree.c (functions supporting +quad tree searching and query). There are also some new prototypes for +the tree stuff in shapefil.h ... including some prototypes for functions +you don't require and hence that I haven't implemented at this time. + +I have also prepared a demonstration program using the API. That is +the ``shpdumptree'' program, with the source code in shpdumptree.c. The +shpdumptree program has two functions. One is to dump an ASCII rendering +of the internal quadtree, and the other is example use of a quad tree +searching function. + +Dumping the Tree +---------------- + +The tree dumping is done as shown below. The "-maxdepth" commandline +switch can be used to control the maximum depth, otherwise it internally +computes a ``reasonable depth'' to use based on the number of structures +in the shapefile. + +warmerda@gdal[207]% shptreedump -maxdepth 6 eg_data/polygon.shp +( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (489292.31,4765610.50) + Shapes(0): + ( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (481118.01,4765610.50) + Shapes(0): + ( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (481118.01,4759281.03) + Shapes(0): + ( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (476622.14,4759281.03) + Shapes(0): + ( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (476622.14,4755799.81) + Shapes(0): + ( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (474149.41,4755799.81) + Shapes(6): 395 397 402 404 405 422 + ) + ( SHPTreeNode + Min = (473599.92,4751545.00) + Max = (476622.14,4755799.81) + Shapes(10): 392 394 403 413 414 417 426 433 434 447 + ) + ) +... + +A structure like the following represents one node in the tree. In +this case it cover the region of 473599.92 < X < 476622.14,and +4751545.0 < Y < 4755799.81. There are ten shapes within this region +who's shapeids are 392, 394 ... 447. This node has no children nodes. + + ( SHPTreeNode + Min = (473599.92,4751545.00) + Max = (476622.14,4755799.81) + Shapes(10): 392 394 403 413 414 417 426 433 434 447 + ) + +The heirarchy of indentation is intended to show the parent, child +relationship between nodes, with the tree being deeper the further to the +right you go. + +The `-v' flag to the program can be used to expand the report to include +the full information about shapes, not just their shapeid. This can result +in a report looking more like this: + + ... + ( SHPTreeNode + Min = (478095.78,4751545.00) + Max = (481118.01,4755799.81) + Shapes(3): + ( Shape + ShapeId = 448 + Min = (479988.09,4753300.00) + Max = (480705.59,4754236.50) + Vertex[0] = (480136.59,4754174.50) + Vertex[1] = (480229.97,4754182.00) + Vertex[2] = (480370.09,4754200.50) + Vertex[3] = (480695.12,4754236.50) + Vertex[4] = (480687.97,4754129.50) + Vertex[5] = (480650.47,4754075.50) + Vertex[6] = (480520.62,4753948.00) + Vertex[7] = (480490.00,4753900.00) + Vertex[8] = (480499.78,4753840.50) + Vertex[9] = (480500.97,4753820.50) + Vertex[10] = (480534.75,4753660.50) + Vertex[11] = (480560.00,4753565.00) + Vertex[12] = (480574.91,4753550.50) + ... + +While it is possible to part the output of the shptreedump program, and +insert it into your database, my intention was that the shptreedump program +would serve as an example of how to pre-order traversal of the quad tree, +and collect the information you will need to insert into your database. +I would then expect you to write a new program based on shptreedump that +calls a C API for your database to insert objects instead of printing them +out. Alternatively there may be an ASCII format for loading tables that +you could modify the program to output. + +Searching +--------- + +The other thing that you can do with the shptreedump program is to +perform a search on the quadtree. For instance the following shows +searching on a small region. + +% shptreedump -search 471127 4751545 476622 4759281 eg_data/polygon.shp +Shape 17: not in area of interest, but fetched. +Shape 31: not in area of interest, but fetched. +Shape 52: not in area of interest, but fetched. +Shape 76: not in area of interest, but fetched. +Shape 82: not in area of interest, but fetched. +Shape 104: not in area of interest, but fetched. +Shape 124: not in area of interest, but fetched. +Shape 134: not in area of interest, but fetched. +Shape 139: not in area of interest, but fetched. +Shape 154: not in area of interest, but fetched. +Shape 175: not in area of interest, but fetched. +Shape 177: not in area of interest, but fetched. +Shape 185: not in area of interest, but fetched. +Shape 192: not in area of interest, but fetched. +Shape 196: appears to be in area of interest. +.... + + +I have included this capability (and the SHPTreeFindLikelyShapes() function) +so that you can see a working example of how to search this quad tree. +Note that searching is a multi-stage affair. + +First a pass is made over the quadtree, collecting the shapeids of all +shapes contained in a quadtree node for which the bounding rectangle overlaps +the search rectangle. This is all accomplished by SHPTreeFindLikelyShapes() +in shptree.c. + +The second phase is to fetch the actual shapes, and verify if their bounding +box falls within the area of interest. This is necessary because the shape +will tend to have a significantly smaller bounding rectangle than the tree +node in which it is found. This can result ``false positives'' on the first +phase search, as indicated by teh ``not in area of interest, but fetched'' +messages above. This stage is done in the SHPTreeNodeSearchAndDump() +function in shptreedump.c. + +A possible third phase is to verify that the actualy line segments in the +shape actually cross the area of interest. I don't both with this as it +is complicated, and assuming that the drawing engine takes care of clipping +it is quite a bit easier to let it fall through. + +Building +-------- + +I have added a makefile.vc to the shapelib distribution. After you have +unpacked the shapefile you should have a shapelib subdirectory. If you +cd to that directory, and enter ``nmake -f makefile.vc'' in a DOS window +you should be able to build everything with VC++ (assuming it is properly +installed and in your path). + +You can also create a project in VC just including the files +shpopen.c, shptree.c and shptreedump.c, building as a Win32 console +application. + +For your convenience I am including prebuild .obj files, and .exe files +in the distribution. + diff --git a/support/ShapeLib/ShapeLib.vcxproj b/support/ShapeLib/ShapeLib.vcxproj new file mode 100644 index 00000000..ccea5049 --- /dev/null +++ b/support/ShapeLib/ShapeLib.vcxproj @@ -0,0 +1,194 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {A0B00502-605B-4382-B313-5983F6BC8E71} + Win32Proj + ShapeLib + + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + false + v120 + true + Unicode + + + StaticLibrary + false + v120 + true + Unicode + + + + + + + + + + + + + + + + + + + $(SolutionDir)lib\$(PlatformToolset)\$(Platform)\ + $(ProjectDir)$(Platform)\$(Configuration)\ + + + $(SolutionDir)lib\$(PlatformToolset)\$(Platform)\ + $(ProjectDir)$(Platform)\$(Configuration)\ + + + $(SolutionDir)lib\$(PlatformToolset)\$(Platform)\ + $(ProjectDir)$(Platform)\$(Configuration)\ + + + $(SolutionDir)lib\$(PlatformToolset)\$(Platform)\ + $(ProjectDir)$(Platform)\$(Configuration)\ + + + + + + Level3 + Disabled + WIN32;_CRT_SECURE_NO_WARNINGS;SHAPELIB_DLLEXPORT;_DEBUG;_LIB;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + OldStyle + false + + + Windows + true + + + $(OutDir)$(TargetName)$(TargetExt) + + + %(AdditionalLibraryDirectories) + + + + + + + Level3 + Disabled + WIN32;_CRT_SECURE_NO_WARNINGS;SHAPELIB_DLLEXPORT;_DEBUG;_LIB;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + OldStyle + false + + + Windows + true + + + $(OutDir)$(TargetName)$(TargetExt) + + + %(AdditionalLibraryDirectories) + + + + + Level3 + + + Full + true + true + WIN32;_CRT_SECURE_NO_WARNINGS;SHAPELIB_DLLEXPORT;NDEBUG;_LIB;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + None + false + + + Windows + true + true + true + + + $(OutDir)$(TargetName)$(TargetExt) + + + %(AdditionalLibraryDirectories) + + + + + Level3 + + + Full + true + true + WIN32;_CRT_SECURE_NO_WARNINGS;SHAPELIB_DLLEXPORT;NDEBUG;_LIB;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + None + false + + + Windows + true + true + true + + + $(OutDir)$(TargetName)$(TargetExt) + + + %(AdditionalLibraryDirectories) + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/support/ShapeLib/ShapeLib.vcxproj.filters b/support/ShapeLib/ShapeLib.vcxproj.filters new file mode 100644 index 00000000..d2d4a1d5 --- /dev/null +++ b/support/ShapeLib/ShapeLib.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/support/ShapeLib/aclocal.m4 b/support/ShapeLib/aclocal.m4 new file mode 100644 index 00000000..110817da --- /dev/null +++ b/support/ShapeLib/aclocal.m4 @@ -0,0 +1,1217 @@ +# generated automatically by aclocal 1.15 -*- Autoconf -*- + +# Copyright (C) 1996-2014 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_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2014 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.15' +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.15], [], + [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 AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Copyright (C) 2011-2014 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_AR([ACT-IF-FAIL]) +# ------------------------- +# Try to determine the archiver interface, and trigger the ar-lib wrapper +# if it is needed. If the detection of archiver interface fails, run +# ACT-IF-FAIL (default is to abort configure with a proper error message). +AC_DEFUN([AM_PROG_AR], +[AC_BEFORE([$0], [LT_INIT])dnl +AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([ar-lib])dnl +AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) +: ${AR=ar} + +AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], + [AC_LANG_PUSH([C]) + am_cv_ar_interface=ar + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], + [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + ]) + AC_LANG_POP([C])]) + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + m4_default([$1], + [AC_MSG_ERROR([could not determine $AR interface])]) + ;; +esac +AC_SUBST([AR])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2014 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], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2014 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_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$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 +m4_define([_AM_COND_VALUE_$1], [$2])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-2014 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. + + +# 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", "OBJC", "OBJCXX", "UPC", or "GJC". +# 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 + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" 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". + rm -rf conftest.dir + 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 + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + 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 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # 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. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + 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 + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj 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 $am__obj 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], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2014 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_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + 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 -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/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"` + # 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'`; 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"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2014 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 macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# 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.65])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], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +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], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [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]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). 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])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# 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_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2014 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 +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2014 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. + +# 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-2014 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_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.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 +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +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-2014 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_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 is modern enough. +# If it is, 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 +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2014 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_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], +[m4_foreach_w([_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])]) + +# Copyright (C) 1999-2014 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_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2014 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_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2014 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_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# 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 ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + 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 + 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 + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + 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]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2014 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_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2014 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-2014 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 outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2014 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_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. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + 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 + +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) diff --git a/support/ShapeLib/ar-lib b/support/ShapeLib/ar-lib new file mode 100644 index 00000000..463b9ec0 --- /dev/null +++ b/support/ShapeLib/ar-lib @@ -0,0 +1,270 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2012-03-01.08; # UTC + +# Copyright (C) 2010-2014 Free Software Foundation, Inc. +# Written by Peter Rosin . +# +# 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, see . + +# 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. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv in + mingw) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat < /dev/null 2>&1 || { + echo "**Error**: You must have \`libtool' installed." + echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" + echo + exit 1 +} + +(autoreconf --version) < /dev/null > /dev/null 2>&1 || { + echo "**Error**: You must have \`autoreconf' installed." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + echo + exit 1 +} + + +( + cd "$srcdir" + echo "Running autoreconf..." + autoreconf -fiv +) + + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure "$@" ... + $srcdir/configure "$@" \ + && echo Now type \`make\' to compile. || exit 1 +else + echo Skipping configure process. +fi diff --git a/support/ShapeLib/compile b/support/ShapeLib/compile new file mode 100644 index 00000000..a85b723c --- /dev/null +++ b/support/ShapeLib/compile @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# 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, see . + +# 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. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# 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-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/support/ShapeLib/config.guess b/support/ShapeLib/config.guess new file mode 100644 index 00000000..16592509 --- /dev/null +++ b/support/ShapeLib/config.guess @@ -0,0 +1,1441 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2015 Free Software Foundation, Inc. + +timestamp='2015-08-20' + +# 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 3 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, see . +# +# 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. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches to . + + +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 1992-2015 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 + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + +# 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 tuples: *-*-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=`(uname -p 2>/dev/null || \ + /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 ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-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*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + 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 + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + 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/[-_].*//' | cut -d. -f1,2` + ;; + 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}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_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 ;; + *:Sortix:*:*) + echo ${UNAME_MACHINE}-unknown-sortix + 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'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + 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 ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + 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:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-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:*:[4567]) + 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/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + 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 -q __LP64__ + 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:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + *:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-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-${LIBC}`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/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-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 -q ld.so.1 + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-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:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-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 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + 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 ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + 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.[02]*:*) + 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 i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-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; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + 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; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; 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.[02]*:*) + 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 ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + 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 + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + 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 ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + 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 ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +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/support/ShapeLib/config.sub b/support/ShapeLib/config.sub new file mode 100644 index 00000000..1acc966a --- /dev/null +++ b/support/ShapeLib/config.sub @@ -0,0 +1,1813 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2015 Free Software Foundation, Inc. + +timestamp='2015-08-20' + +# 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 3 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, see . +# +# 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. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# 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. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# 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 1992-2015 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-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + 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 | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -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*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -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 \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-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-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | 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-* | sv1-* | sx*-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # 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 + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + 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 + ;; + cr16 | cr16-*) + basic_machine=cr16-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 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + 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*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 + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + 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 + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + 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 + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + 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 + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + 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 | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + 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 | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + 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 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + 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 + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + 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 + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-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[24]aeb | 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. + -auroraux) + os=-auroraux + ;; + -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* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -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* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -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* | -es* | -tirtos*) + # 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 + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -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 + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + 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 + ;; + 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 + ;; + -cnk*|-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/support/ShapeLib/configure b/support/ShapeLib/configure new file mode 100644 index 00000000..0ceb379d --- /dev/null +++ b/support/ShapeLib/configure @@ -0,0 +1,19184 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for shapelib 1.4.1. +# +# +# Copyright (C) 1992-1996, 1998-2012 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=: + # Pre-4.2 versions of Zsh do 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +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.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do 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_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_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 || +$as_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" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +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 + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# 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 + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # 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 +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +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 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + 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 -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +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='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# 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'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/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= + +# Identity of this package. +PACKAGE_NAME='shapelib' +PACKAGE_TARNAME='shapelib' +PACKAGE_VERSION='1.4.1' +PACKAGE_STRING='shapelib 1.4.1' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +ac_unique_file="shapefil.h" +# 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='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +PLATFORM_WIN32_FALSE +PLATFORM_WIN32_TRUE +LIBM +PROJ_LIBS +PROJ_CFLAGS +CXXCPP +CPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +SHAPELIB_SO_VERSION +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +ac_ct_AR +AR +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +with_proj_cflags +with_proj_libs +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +LT_SYS_LIBRARY_PATH +CPP +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# 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' +runstatedir='${localstatedir}/run' +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= ;; + *) 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_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=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_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$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 ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -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_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=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 ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_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'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +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 runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +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 + 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 .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# 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 -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + 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 .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + 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 shapelib 1.4.1 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] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --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/shapelib] + --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 + +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 + case $ac_init_help in + short | recursive ) echo "Configuration of shapelib 1.4.1:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --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) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-proj-cflags CFLAGS for the PROJ.4 headers + --with-proj-libs LIBS for the PROJ.4 libraries + +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 (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CPP C preprocessor + CXXCPP C++ preprocessor + +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 the package provider. +_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" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && 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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_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 + $as_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 +shapelib configure 1.4.1 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 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 + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* 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 $2 (); +/* 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_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link +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 shapelib $as_me 1.4.1, which was +generated by GNU Autoconf 2.69. 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=. + $as_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=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append 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 + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset 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 + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + 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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; 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 + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_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'; as_fn_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 + +$as_echo "/* confdefs.h */" > 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 + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + 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. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_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,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_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 + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_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. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +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 + + + + + +am__api_version='1.15' + +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 + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +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. + + +# 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. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$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 + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$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' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# 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 ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + 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 + 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". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +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 $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&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" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&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 + as_fn_executable_p "$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 + + test -d ./--version && rmdir ./--version + 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. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +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 + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + 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='shapelib' + VERSION='1.4.1' + + +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"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_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='\' + am__nodep='_no' +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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$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" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM 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. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; 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 | *.dSYM | *.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 +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; 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 | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; 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 | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* 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" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +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) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +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 + +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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +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="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&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". + rm -rf conftest.dir + 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 + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + 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 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # 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. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + 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 + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj 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 $am__obj 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$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 + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +$as_echo_n "checking the archiver ($AR) interface... " >&6; } +if ${am_cv_ar_interface+:} false; then : + $as_echo_n "(cached) " >&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 + + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +$as_echo "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + + +SHAPELIB_SO_VERSION=2:2:0 + + +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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$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" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* 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" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +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) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +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 + +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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +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="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&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". + rm -rf conftest.dir + 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 + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + 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 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # 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. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + 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 + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj 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 $am__obj 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$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=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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$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= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&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". + rm -rf conftest.dir + 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 + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + 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 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # 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. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + 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 + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj 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 $am__obj 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$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 + + + +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 + +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 + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&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 && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +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 + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&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` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +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 + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +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 delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_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 +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_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_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + 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" + as_fn_executable_p "$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 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_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 + as_fn_arith $ac_count + 1 && ac_count=$as_val + 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 + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + 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" + as_fn_executable_p "$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 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_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 + as_fn_arith $ac_count + 1 && ac_count=$as_val + 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 + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_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 fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_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_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&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 yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&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 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&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 + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + 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 + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&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* | cegcc*) + # 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; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + 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; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # 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 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + 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 + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + 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` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # 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`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + 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` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$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 + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&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 +# that 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 +aix[4-9]*) + 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', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | 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 + ;; + +haiku*) + 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])(-bit)?( [LM]SB)? 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 + ;; + +interix[3-9]*) + # 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 glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + 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=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + 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 + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +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 test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 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 for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&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]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + 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 + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# 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 + +# Try without a prefix underscore, 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. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$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=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && 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 <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_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 -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; 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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_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 +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; 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 what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; 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* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + 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-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + 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" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +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 + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + 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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* 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 +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +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=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + +func_stripname_cnf () +{ + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # 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 --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +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 + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +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 set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&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 <<_LT_EOF 1>&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 + +_LT_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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&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 <<_LT_EOF 1>&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 + +_LT_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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +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;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# 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 the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$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 +echo "$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 -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # 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:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; 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= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # 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' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # 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). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # 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 + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + 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 ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # 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' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + 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' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # 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' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + 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 + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # 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:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; 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 + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$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 "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$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:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$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:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_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 + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # 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_|_GLOBAL__F[ID]_.*' + # 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. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # 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 yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [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 + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, 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 install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + 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 + ;; + esac + ;; + + 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* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + 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/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + 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, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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 + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + 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' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + 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; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # 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; func_echo_all \"$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' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; 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 '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; 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~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + 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 $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $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 <<_LT_EOF 1>&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. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $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 cannot +*** 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 + ;; + *) + # 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. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + 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 + ;; + + 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 $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $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 no = "$ld_shlibs"; 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 yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX 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") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; 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 + : + 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 yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; 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. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +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' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + 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 + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # 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. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # 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 $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + 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 `func_echo_all "$deplibs" | $SED '\''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' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=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* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $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 no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=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 yes,no = "$GCC,$with_gnu_ld"; 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 $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $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' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$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 "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $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 + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=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 yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + link_all_deplibs=no + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + 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 + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; 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" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$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='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-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; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_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 + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $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 $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + 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' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $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 -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + 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 and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; 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* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; 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 CANNOT 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='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; 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 + ;; + + 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 + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# 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 yes,yes = "$GCC,$enable_shared"; 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. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 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\":${as_lineno-$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=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # 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. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +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" +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 # correct to gnu/linux during the next big refactor + 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' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; 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 + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # 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' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # 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' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + 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=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $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' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + 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* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + 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~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + 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="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + 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 + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + 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 + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # 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' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # 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$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`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + ;; + +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[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + 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 + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + 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=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + 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 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + 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' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + 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 + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # 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 + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # 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 + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;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' + ;; + +netbsdelf*-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='NetBSD ld.elf_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 # correct to gnu/linux during the next big refactor + 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=qnx + 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='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + 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 + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + 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~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +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 + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + 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 # correct to gnu/linux during the next big refactor + 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=sco + 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 + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + 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' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; 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* | cegcc*) + 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 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* 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 +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; 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 + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* 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 +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* 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 +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* 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 +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* 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 +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && 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" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; 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 <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#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 + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 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; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; 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 <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#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 + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 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; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$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 + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&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" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "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" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +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 + +CC=$lt_save_CC + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$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 confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +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 + +else + _lt_caught_CXX_error=yes +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 + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # 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 +echo "$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 +echo "$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 -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + 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++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; 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 no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&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 yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&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 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$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 yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -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 -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; 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 + : + 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 yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; 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. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +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' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + 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* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # 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_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + 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, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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 + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes != "$lt_cv_apple_cc_single_mod"; then + 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$_lt_dsymutil" + archive_expsym_cmds_CXX="sed '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$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + ;; + + 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 + ;; + + freebsd2.*) + # 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* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + 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 "x$output_objdir/$soname" = "x$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) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + 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_direct_absolute_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; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; 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 $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $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 + ;; + + interix[3-9]*) + 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" && func_echo_all "-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 yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$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=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + 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; func_echo_all "$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* | ecpc* ) + # 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* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + 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' + ;; + esac + + 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; func_echo_all \"$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=`func_echo_all "$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; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + 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='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # 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' + ;; + esac + ;; + 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::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + 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__`"; 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=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | 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. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + 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" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + 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" && func_echo_all "-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' + ;; + esac + + 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=`func_echo_all "$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; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + 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 -v "^Configured with:" | $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* | sunCC*) + # 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 compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # 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 yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $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 $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -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 -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $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 $wl-h $wl$soname -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 -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + 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 CANNOT 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_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='$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,$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' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + 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 + ;; + + 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 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # 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= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; 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 + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev 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 + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$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 no = "$pre_test_object_deps_done"; 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 +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # 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= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; 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 ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # 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' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # 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). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + 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= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # 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 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; 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_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 + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # 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' + ;; + 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* | 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 ia64 != "$host_cpu"; 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* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # 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' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + 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* | sunCC*) + # 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 + ;; + 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 + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that 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 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment + # 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:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; 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 + + + + + +# +# 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\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$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 "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$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:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$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:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_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 + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX 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") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# 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 yes,yes = "$GCC,$enable_shared"; 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. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 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\":${as_lineno-$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=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_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* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&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" +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 # correct to gnu/linux during the next big refactor + 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' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; 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 + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # 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' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # 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' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + 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=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $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' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + 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* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + 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~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + 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' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + 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 + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + 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 + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # 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' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # 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$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`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + ;; + +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[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + 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 + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + 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=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + 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 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + 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' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + 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 + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # 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 + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # 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 + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;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' + ;; + +netbsdelf*-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='NetBSD ld.elf_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 # correct to gnu/linux during the next big refactor + 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=qnx + 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='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + 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 + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + 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~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +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 + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + 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 # correct to gnu/linux during the next big refactor + 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=sco + 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 + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + 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' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + 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 +fi # test yes != "$_lt_caught_CXX_error" + +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 + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + + +# Check whether --with-proj-cflags was given. +if test "${with_proj_cflags+set}" = set; then : + withval=$with_proj_cflags; if test "$withval" != ""; then PROJ_CFLAGS="$withval"; else PROJ_CFLAGS=""; fi +else + PROJ_CFLAGS='-DPROJ4' +fi + + + + +# Check whether --with-proj-libs was given. +if test "${with_proj_libs+set}" = set; then : + withval=$with_proj_libs; PROJ_LIBS="$withval" +else + PROJ_LIBS='-lproj' +fi + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for floor in -lm" >&5 +$as_echo_n "checking for floor in -lm... " >&6; } +if ${ac_cv_lib_m_floor+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* 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 floor (); +int +main () +{ +return floor (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_m_floor=yes +else + ac_cv_lib_m_floor=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_floor" >&5 +$as_echo "$ac_cv_lib_m_floor" >&6; } +if test "x$ac_cv_lib_m_floor" = xyes; then : + LIBM=-lm +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for some Win32 platform" >&5 +$as_echo_n "checking for some Win32 platform... " >&6; } +case "$host" in + *-*-mingw*|*-*-cygwin*) + platform_win32=yes + ;; + *) + platform_win32=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $platform_win32" >&5 +$as_echo "$platform_win32" >&6; } + if test "$platform_win32" = "yes"; then + PLATFORM_WIN32_TRUE= + PLATFORM_WIN32_FALSE='#' +else + PLATFORM_WIN32_TRUE='#' + PLATFORM_WIN32_FALSE= +fi + + +echo +echo "Configuration summary for $PACKAGE $VERSION:" +echo " - Host: ${host}" +echo " - PROJ flags: $PROJ_CFLAGS $PROJ_LIBS" +echo + +ac_config_files="$ac_config_files Makefile contrib/Makefile shapelib.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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; 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 + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_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=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +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= +U= +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=`$as_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. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${PLATFORM_WIN32_TRUE}" && test -z "${PLATFORM_WIN32_FALSE}"; then + as_fn_error $? "conditional \"PLATFORM_WIN32\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $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} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## 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=: + # Pre-4.2 versions of Zsh do 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +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.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +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 + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# 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 + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +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 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + 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 -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_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 || +$as_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" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# 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 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=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 shapelib $as_me 1.4.1, which was +generated by GNU Autoconf 2.69. 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 + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + 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 + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +shapelib config.status 1.4.1 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 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' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +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=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + 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 ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + $as_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. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append 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 || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# 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 + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; + "shapelib.pc") CONFIG_FILES="$CONFIG_FILES shapelib.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + 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_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= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries 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[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[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="$ac_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 || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append 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 '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + 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 || +$as_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"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_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 || ac_write_fail=1 +# 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= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + 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 || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;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 +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_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 "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + 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 -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/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 || +$as_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"` + # 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'`; 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 || +$as_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; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 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. + +# GNU Libtool 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 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool 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, see . + + +# The names of the tagged configurations supported by this script. +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# 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 + +# 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//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# 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 + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# 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 into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# 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 + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# 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 + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# 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 + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# 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 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# 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 + +# 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 + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# 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 a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# 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 + +# 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 DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# 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 + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# 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 + +# 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 + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +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 + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_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 set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # 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" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# 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 + +# 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 + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# 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 a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# 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 + +# 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 DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_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 + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_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 + +# 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 + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +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 + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# 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 || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/support/ShapeLib/configure.ac b/support/ShapeLib/configure.ac new file mode 100644 index 00000000..7ec86d5b --- /dev/null +++ b/support/ShapeLib/configure.ac @@ -0,0 +1,70 @@ +dnl Process this file with autoconf to produce a configure script. + +m4_define(shapelib_version_major, 1) +m4_define(shapelib_version_minor, 4) +m4_define(shapelib_version_micro, 1) + +AC_PREREQ(2.62) +AC_INIT(shapelib, shapelib_version_major.shapelib_version_minor.shapelib_version_micro) +AC_CONFIG_MACRO_DIR(m4) +AC_CONFIG_SRCDIR(shapefil.h) + +AM_INIT_AUTOMAKE([-Wall]) + +AM_SILENT_RULES([yes]) + +m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) + +dnl See http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html +AC_SUBST([SHAPELIB_SO_VERSION], [2:2:0]) + +AC_PROG_CC +AC_PROG_CXX +AM_PROG_CC_C_O +AC_LANG([C]) +AC_LANG([C++]) + +dnl ************************** Libtool initialization ************************* +LT_INIT + +dnl ********************************* Modules ********************************* +AC_ARG_WITH([proj-cflags], + [AS_HELP_STRING([--with-proj-cflags], [CFLAGS for the PROJ.4 headers])], + [if test "$withval" != ""; then PROJ_CFLAGS="$withval"; else PROJ_CFLAGS=""; fi], + [PROJ_CFLAGS='-DPROJ4']) +AC_SUBST([PROJ_CFLAGS]) + +AC_ARG_WITH([proj-libs], + [AS_HELP_STRING([--with-proj-libs], [LIBS for the PROJ.4 libraries])], + [PROJ_LIBS="$withval"], + [PROJ_LIBS='-lproj']) +AC_SUBST([PROJ_LIBS]) + +dnl ****************************** Detect libm ******************************* + +AC_CHECK_LIB(m,floor,LIBM=-lm) +AC_SUBST([LIBM]) + +dnl ****************************** Detect Win32 ******************************* +AC_MSG_CHECKING([for some Win32 platform]) +case "$host" in + *-*-mingw*|*-*-cygwin*) + platform_win32=yes + ;; + *) + platform_win32=no + ;; +esac +AC_MSG_RESULT([$platform_win32]) +AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes") + +dnl ********************************* Summary ********************************* +echo +echo "Configuration summary for $PACKAGE $VERSION:" +echo " - Host: ${host}" +echo " - PROJ flags: $PROJ_CFLAGS $PROJ_LIBS" +echo + +AC_CONFIG_FILES([Makefile contrib/Makefile shapelib.pc]) + +AC_OUTPUT diff --git a/support/ShapeLib/contrib/Makefile.am b/support/ShapeLib/contrib/Makefile.am new file mode 100644 index 00000000..d9fc8c3c --- /dev/null +++ b/support/ShapeLib/contrib/Makefile.am @@ -0,0 +1,59 @@ +CONTRIB_CFLAGS = -I$(top_srcdir) -DDEBUG -DDEBUG2 + +# Extra files to distribute in the source tarball +EXTRA_DIST = makefile.vc tests/shpproj.sh doc/Shape_PointInPoly_README.txt doc/shpproj.txt doc/shpsort.txt ShapeFileII.pas + +# Installed executables +bin_PROGRAMS = dbfcat dbfinfo shpcat shpdxf shpfix shpsort Shape_PointInPoly shpcentrd shpdata shpinfo shpproj shpwkb + +dbfcat_SOURCES = dbfcat.c +dbfcat_CPPFLAGS = $(CONTRIB_CFLAGS) +dbfcat_LDADD = $(top_builddir)/libshp.la + +dbfinfo_SOURCES = dbfinfo.c +dbfinfo_CPPFLAGS = $(CONTRIB_CFLAGS) +dbfinfo_LDADD = $(top_builddir)/libshp.la + +shpcat_SOURCES = shpcat.c +shpcat_CPPFLAGS = $(CONTRIB_CFLAGS) +shpcat_LDADD = $(top_builddir)/libshp.la + +shpdxf_SOURCES = shpdxf.c +shpdxf_CPPFLAGS = $(CONTRIB_CFLAGS) +shpdxf_LDADD = $(top_builddir)/libshp.la + +shpfix_SOURCES = shpfix.c +shpfix_CPPFLAGS = $(CONTRIB_CFLAGS) +shpfix_LDADD = $(top_builddir)/libshp.la + +shpsort_SOURCES = shpsort.c +shpsort_CPPFLAGS = $(CONTRIB_CFLAGS) +shpsort_LDADD = $(top_builddir)/libshp.la -lm + +Shape_PointInPoly_SOURCES = Shape_PointInPoly.cpp +Shape_PointInPoly_CPPFLAGS = $(CONTRIB_CFLAGS) +Shape_PointInPoly_LDADD = $(top_builddir)/libshp.la + +shpcentrd_SOURCES = shpcentrd.c shpgeo.c shpgeo.h +shpcentrd_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpcentrd_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +shpdata_SOURCES = shpdata.c shpgeo.c shpgeo.h +shpdata_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpdata_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +shpinfo_SOURCES = shpinfo.c shpgeo.c shpgeo.h +shpinfo_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpinfo_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +shpproj_SOURCES = shpproj.c shpgeo.c shpgeo.h +shpproj_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpproj_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +shpwkb_SOURCES = shpwkb.c shpgeo.c shpgeo.h +shpwkb_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpwkb_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +# Tests +TESTS_ENVIRONMENT = top_builddir=$(abs_top_builddir) +TESTS = tests/shpproj.sh diff --git a/support/ShapeLib/contrib/Makefile.in b/support/ShapeLib/contrib/Makefile.in new file mode 100644 index 00000000..a037d40e --- /dev/null +++ b/support/ShapeLib/contrib/Makefile.in @@ -0,0 +1,1437 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 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@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@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@ +bin_PROGRAMS = dbfcat$(EXEEXT) dbfinfo$(EXEEXT) shpcat$(EXEEXT) \ + shpdxf$(EXEEXT) shpfix$(EXEEXT) shpsort$(EXEEXT) \ + Shape_PointInPoly$(EXEEXT) shpcentrd$(EXEEXT) shpdata$(EXEEXT) \ + shpinfo$(EXEEXT) shpproj$(EXEEXT) shpwkb$(EXEEXT) +subdir = contrib +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_Shape_PointInPoly_OBJECTS = \ + Shape_PointInPoly-Shape_PointInPoly.$(OBJEXT) +Shape_PointInPoly_OBJECTS = $(am_Shape_PointInPoly_OBJECTS) +Shape_PointInPoly_DEPENDENCIES = $(top_builddir)/libshp.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +am_dbfcat_OBJECTS = dbfcat-dbfcat.$(OBJEXT) +dbfcat_OBJECTS = $(am_dbfcat_OBJECTS) +dbfcat_DEPENDENCIES = $(top_builddir)/libshp.la +am_dbfinfo_OBJECTS = dbfinfo-dbfinfo.$(OBJEXT) +dbfinfo_OBJECTS = $(am_dbfinfo_OBJECTS) +dbfinfo_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpcat_OBJECTS = shpcat-shpcat.$(OBJEXT) +shpcat_OBJECTS = $(am_shpcat_OBJECTS) +shpcat_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpcentrd_OBJECTS = shpcentrd-shpcentrd.$(OBJEXT) \ + shpcentrd-shpgeo.$(OBJEXT) +shpcentrd_OBJECTS = $(am_shpcentrd_OBJECTS) +am__DEPENDENCIES_1 = +shpcentrd_DEPENDENCIES = $(top_builddir)/libshp.la \ + $(am__DEPENDENCIES_1) +am_shpdata_OBJECTS = shpdata-shpdata.$(OBJEXT) \ + shpdata-shpgeo.$(OBJEXT) +shpdata_OBJECTS = $(am_shpdata_OBJECTS) +shpdata_DEPENDENCIES = $(top_builddir)/libshp.la $(am__DEPENDENCIES_1) +am_shpdxf_OBJECTS = shpdxf-shpdxf.$(OBJEXT) +shpdxf_OBJECTS = $(am_shpdxf_OBJECTS) +shpdxf_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpfix_OBJECTS = shpfix-shpfix.$(OBJEXT) +shpfix_OBJECTS = $(am_shpfix_OBJECTS) +shpfix_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpinfo_OBJECTS = shpinfo-shpinfo.$(OBJEXT) \ + shpinfo-shpgeo.$(OBJEXT) +shpinfo_OBJECTS = $(am_shpinfo_OBJECTS) +shpinfo_DEPENDENCIES = $(top_builddir)/libshp.la $(am__DEPENDENCIES_1) +am_shpproj_OBJECTS = shpproj-shpproj.$(OBJEXT) \ + shpproj-shpgeo.$(OBJEXT) +shpproj_OBJECTS = $(am_shpproj_OBJECTS) +shpproj_DEPENDENCIES = $(top_builddir)/libshp.la $(am__DEPENDENCIES_1) +am_shpsort_OBJECTS = shpsort-shpsort.$(OBJEXT) +shpsort_OBJECTS = $(am_shpsort_OBJECTS) +shpsort_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpwkb_OBJECTS = shpwkb-shpwkb.$(OBJEXT) shpwkb-shpgeo.$(OBJEXT) +shpwkb_OBJECTS = $(am_shpwkb_OBJECTS) +shpwkb_DEPENDENCIES = $(top_builddir)/libshp.la $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(Shape_PointInPoly_SOURCES) $(dbfcat_SOURCES) \ + $(dbfinfo_SOURCES) $(shpcat_SOURCES) $(shpcentrd_SOURCES) \ + $(shpdata_SOURCES) $(shpdxf_SOURCES) $(shpfix_SOURCES) \ + $(shpinfo_SOURCES) $(shpproj_SOURCES) $(shpsort_SOURCES) \ + $(shpwkb_SOURCES) +DIST_SOURCES = $(Shape_PointInPoly_SOURCES) $(dbfcat_SOURCES) \ + $(dbfinfo_SOURCES) $(shpcat_SOURCES) $(shpcentrd_SOURCES) \ + $(shpdata_SOURCES) $(shpdxf_SOURCES) $(shpfix_SOURCES) \ + $(shpinfo_SOURCES) $(shpproj_SOURCES) $(shpsort_SOURCES) \ + $(shpwkb_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +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 = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROJ_CFLAGS = @PROJ_CFLAGS@ +PROJ_LIBS = @PROJ_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPELIB_SO_VERSION = @SHAPELIB_SO_VERSION@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +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@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +CONTRIB_CFLAGS = -I$(top_srcdir) -DDEBUG -DDEBUG2 + +# Extra files to distribute in the source tarball +EXTRA_DIST = makefile.vc tests/shpproj.sh doc/Shape_PointInPoly_README.txt doc/shpproj.txt doc/shpsort.txt ShapeFileII.pas +dbfcat_SOURCES = dbfcat.c +dbfcat_CPPFLAGS = $(CONTRIB_CFLAGS) +dbfcat_LDADD = $(top_builddir)/libshp.la +dbfinfo_SOURCES = dbfinfo.c +dbfinfo_CPPFLAGS = $(CONTRIB_CFLAGS) +dbfinfo_LDADD = $(top_builddir)/libshp.la +shpcat_SOURCES = shpcat.c +shpcat_CPPFLAGS = $(CONTRIB_CFLAGS) +shpcat_LDADD = $(top_builddir)/libshp.la +shpdxf_SOURCES = shpdxf.c +shpdxf_CPPFLAGS = $(CONTRIB_CFLAGS) +shpdxf_LDADD = $(top_builddir)/libshp.la +shpfix_SOURCES = shpfix.c +shpfix_CPPFLAGS = $(CONTRIB_CFLAGS) +shpfix_LDADD = $(top_builddir)/libshp.la +shpsort_SOURCES = shpsort.c +shpsort_CPPFLAGS = $(CONTRIB_CFLAGS) +shpsort_LDADD = $(top_builddir)/libshp.la -lm +Shape_PointInPoly_SOURCES = Shape_PointInPoly.cpp +Shape_PointInPoly_CPPFLAGS = $(CONTRIB_CFLAGS) +Shape_PointInPoly_LDADD = $(top_builddir)/libshp.la +shpcentrd_SOURCES = shpcentrd.c shpgeo.c shpgeo.h +shpcentrd_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpcentrd_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm +shpdata_SOURCES = shpdata.c shpgeo.c shpgeo.h +shpdata_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpdata_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm +shpinfo_SOURCES = shpinfo.c shpgeo.c shpgeo.h +shpinfo_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpinfo_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm +shpproj_SOURCES = shpproj.c shpgeo.c shpgeo.h +shpproj_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpproj_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm +shpwkb_SOURCES = shpwkb.c shpgeo.c shpgeo.h +shpwkb_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpwkb_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +# Tests +TESTS_ENVIRONMENT = top_builddir=$(abs_top_builddir) +TESTS = tests/shpproj.sh +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs +$(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 ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu contrib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu contrib/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 +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +Shape_PointInPoly$(EXEEXT): $(Shape_PointInPoly_OBJECTS) $(Shape_PointInPoly_DEPENDENCIES) $(EXTRA_Shape_PointInPoly_DEPENDENCIES) + @rm -f Shape_PointInPoly$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Shape_PointInPoly_OBJECTS) $(Shape_PointInPoly_LDADD) $(LIBS) + +dbfcat$(EXEEXT): $(dbfcat_OBJECTS) $(dbfcat_DEPENDENCIES) $(EXTRA_dbfcat_DEPENDENCIES) + @rm -f dbfcat$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dbfcat_OBJECTS) $(dbfcat_LDADD) $(LIBS) + +dbfinfo$(EXEEXT): $(dbfinfo_OBJECTS) $(dbfinfo_DEPENDENCIES) $(EXTRA_dbfinfo_DEPENDENCIES) + @rm -f dbfinfo$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dbfinfo_OBJECTS) $(dbfinfo_LDADD) $(LIBS) + +shpcat$(EXEEXT): $(shpcat_OBJECTS) $(shpcat_DEPENDENCIES) $(EXTRA_shpcat_DEPENDENCIES) + @rm -f shpcat$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpcat_OBJECTS) $(shpcat_LDADD) $(LIBS) + +shpcentrd$(EXEEXT): $(shpcentrd_OBJECTS) $(shpcentrd_DEPENDENCIES) $(EXTRA_shpcentrd_DEPENDENCIES) + @rm -f shpcentrd$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpcentrd_OBJECTS) $(shpcentrd_LDADD) $(LIBS) + +shpdata$(EXEEXT): $(shpdata_OBJECTS) $(shpdata_DEPENDENCIES) $(EXTRA_shpdata_DEPENDENCIES) + @rm -f shpdata$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpdata_OBJECTS) $(shpdata_LDADD) $(LIBS) + +shpdxf$(EXEEXT): $(shpdxf_OBJECTS) $(shpdxf_DEPENDENCIES) $(EXTRA_shpdxf_DEPENDENCIES) + @rm -f shpdxf$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpdxf_OBJECTS) $(shpdxf_LDADD) $(LIBS) + +shpfix$(EXEEXT): $(shpfix_OBJECTS) $(shpfix_DEPENDENCIES) $(EXTRA_shpfix_DEPENDENCIES) + @rm -f shpfix$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpfix_OBJECTS) $(shpfix_LDADD) $(LIBS) + +shpinfo$(EXEEXT): $(shpinfo_OBJECTS) $(shpinfo_DEPENDENCIES) $(EXTRA_shpinfo_DEPENDENCIES) + @rm -f shpinfo$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpinfo_OBJECTS) $(shpinfo_LDADD) $(LIBS) + +shpproj$(EXEEXT): $(shpproj_OBJECTS) $(shpproj_DEPENDENCIES) $(EXTRA_shpproj_DEPENDENCIES) + @rm -f shpproj$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpproj_OBJECTS) $(shpproj_LDADD) $(LIBS) + +shpsort$(EXEEXT): $(shpsort_OBJECTS) $(shpsort_DEPENDENCIES) $(EXTRA_shpsort_DEPENDENCIES) + @rm -f shpsort$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpsort_OBJECTS) $(shpsort_LDADD) $(LIBS) + +shpwkb$(EXEEXT): $(shpwkb_OBJECTS) $(shpwkb_DEPENDENCIES) $(EXTRA_shpwkb_DEPENDENCIES) + @rm -f shpwkb$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpwkb_OBJECTS) $(shpwkb_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfcat-dbfcat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfinfo-dbfinfo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpcat-shpcat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpcentrd-shpcentrd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpcentrd-shpgeo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpdata-shpdata.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpdata-shpgeo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpdxf-shpdxf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpfix-shpfix.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpinfo-shpgeo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpinfo-shpinfo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpproj-shpgeo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpproj-shpproj.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpsort-shpsort.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpwkb-shpgeo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpwkb-shpwkb.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +dbfcat-dbfcat.o: dbfcat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbfcat-dbfcat.o -MD -MP -MF $(DEPDIR)/dbfcat-dbfcat.Tpo -c -o dbfcat-dbfcat.o `test -f 'dbfcat.c' || echo '$(srcdir)/'`dbfcat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbfcat-dbfcat.Tpo $(DEPDIR)/dbfcat-dbfcat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dbfcat.c' object='dbfcat-dbfcat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbfcat-dbfcat.o `test -f 'dbfcat.c' || echo '$(srcdir)/'`dbfcat.c + +dbfcat-dbfcat.obj: dbfcat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbfcat-dbfcat.obj -MD -MP -MF $(DEPDIR)/dbfcat-dbfcat.Tpo -c -o dbfcat-dbfcat.obj `if test -f 'dbfcat.c'; then $(CYGPATH_W) 'dbfcat.c'; else $(CYGPATH_W) '$(srcdir)/dbfcat.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbfcat-dbfcat.Tpo $(DEPDIR)/dbfcat-dbfcat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dbfcat.c' object='dbfcat-dbfcat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbfcat-dbfcat.obj `if test -f 'dbfcat.c'; then $(CYGPATH_W) 'dbfcat.c'; else $(CYGPATH_W) '$(srcdir)/dbfcat.c'; fi` + +dbfinfo-dbfinfo.o: dbfinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbfinfo-dbfinfo.o -MD -MP -MF $(DEPDIR)/dbfinfo-dbfinfo.Tpo -c -o dbfinfo-dbfinfo.o `test -f 'dbfinfo.c' || echo '$(srcdir)/'`dbfinfo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbfinfo-dbfinfo.Tpo $(DEPDIR)/dbfinfo-dbfinfo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dbfinfo.c' object='dbfinfo-dbfinfo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbfinfo-dbfinfo.o `test -f 'dbfinfo.c' || echo '$(srcdir)/'`dbfinfo.c + +dbfinfo-dbfinfo.obj: dbfinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbfinfo-dbfinfo.obj -MD -MP -MF $(DEPDIR)/dbfinfo-dbfinfo.Tpo -c -o dbfinfo-dbfinfo.obj `if test -f 'dbfinfo.c'; then $(CYGPATH_W) 'dbfinfo.c'; else $(CYGPATH_W) '$(srcdir)/dbfinfo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbfinfo-dbfinfo.Tpo $(DEPDIR)/dbfinfo-dbfinfo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dbfinfo.c' object='dbfinfo-dbfinfo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbfinfo-dbfinfo.obj `if test -f 'dbfinfo.c'; then $(CYGPATH_W) 'dbfinfo.c'; else $(CYGPATH_W) '$(srcdir)/dbfinfo.c'; fi` + +shpcat-shpcat.o: shpcat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcat-shpcat.o -MD -MP -MF $(DEPDIR)/shpcat-shpcat.Tpo -c -o shpcat-shpcat.o `test -f 'shpcat.c' || echo '$(srcdir)/'`shpcat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcat-shpcat.Tpo $(DEPDIR)/shpcat-shpcat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpcat.c' object='shpcat-shpcat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcat-shpcat.o `test -f 'shpcat.c' || echo '$(srcdir)/'`shpcat.c + +shpcat-shpcat.obj: shpcat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcat-shpcat.obj -MD -MP -MF $(DEPDIR)/shpcat-shpcat.Tpo -c -o shpcat-shpcat.obj `if test -f 'shpcat.c'; then $(CYGPATH_W) 'shpcat.c'; else $(CYGPATH_W) '$(srcdir)/shpcat.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcat-shpcat.Tpo $(DEPDIR)/shpcat-shpcat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpcat.c' object='shpcat-shpcat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcat-shpcat.obj `if test -f 'shpcat.c'; then $(CYGPATH_W) 'shpcat.c'; else $(CYGPATH_W) '$(srcdir)/shpcat.c'; fi` + +shpcentrd-shpcentrd.o: shpcentrd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcentrd-shpcentrd.o -MD -MP -MF $(DEPDIR)/shpcentrd-shpcentrd.Tpo -c -o shpcentrd-shpcentrd.o `test -f 'shpcentrd.c' || echo '$(srcdir)/'`shpcentrd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcentrd-shpcentrd.Tpo $(DEPDIR)/shpcentrd-shpcentrd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpcentrd.c' object='shpcentrd-shpcentrd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcentrd-shpcentrd.o `test -f 'shpcentrd.c' || echo '$(srcdir)/'`shpcentrd.c + +shpcentrd-shpcentrd.obj: shpcentrd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcentrd-shpcentrd.obj -MD -MP -MF $(DEPDIR)/shpcentrd-shpcentrd.Tpo -c -o shpcentrd-shpcentrd.obj `if test -f 'shpcentrd.c'; then $(CYGPATH_W) 'shpcentrd.c'; else $(CYGPATH_W) '$(srcdir)/shpcentrd.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcentrd-shpcentrd.Tpo $(DEPDIR)/shpcentrd-shpcentrd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpcentrd.c' object='shpcentrd-shpcentrd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcentrd-shpcentrd.obj `if test -f 'shpcentrd.c'; then $(CYGPATH_W) 'shpcentrd.c'; else $(CYGPATH_W) '$(srcdir)/shpcentrd.c'; fi` + +shpcentrd-shpgeo.o: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcentrd-shpgeo.o -MD -MP -MF $(DEPDIR)/shpcentrd-shpgeo.Tpo -c -o shpcentrd-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcentrd-shpgeo.Tpo $(DEPDIR)/shpcentrd-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpcentrd-shpgeo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcentrd-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c + +shpcentrd-shpgeo.obj: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcentrd-shpgeo.obj -MD -MP -MF $(DEPDIR)/shpcentrd-shpgeo.Tpo -c -o shpcentrd-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcentrd-shpgeo.Tpo $(DEPDIR)/shpcentrd-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpcentrd-shpgeo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcentrd-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` + +shpdata-shpdata.o: shpdata.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdata-shpdata.o -MD -MP -MF $(DEPDIR)/shpdata-shpdata.Tpo -c -o shpdata-shpdata.o `test -f 'shpdata.c' || echo '$(srcdir)/'`shpdata.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdata-shpdata.Tpo $(DEPDIR)/shpdata-shpdata.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpdata.c' object='shpdata-shpdata.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdata-shpdata.o `test -f 'shpdata.c' || echo '$(srcdir)/'`shpdata.c + +shpdata-shpdata.obj: shpdata.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdata-shpdata.obj -MD -MP -MF $(DEPDIR)/shpdata-shpdata.Tpo -c -o shpdata-shpdata.obj `if test -f 'shpdata.c'; then $(CYGPATH_W) 'shpdata.c'; else $(CYGPATH_W) '$(srcdir)/shpdata.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdata-shpdata.Tpo $(DEPDIR)/shpdata-shpdata.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpdata.c' object='shpdata-shpdata.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdata-shpdata.obj `if test -f 'shpdata.c'; then $(CYGPATH_W) 'shpdata.c'; else $(CYGPATH_W) '$(srcdir)/shpdata.c'; fi` + +shpdata-shpgeo.o: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdata-shpgeo.o -MD -MP -MF $(DEPDIR)/shpdata-shpgeo.Tpo -c -o shpdata-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdata-shpgeo.Tpo $(DEPDIR)/shpdata-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpdata-shpgeo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdata-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c + +shpdata-shpgeo.obj: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdata-shpgeo.obj -MD -MP -MF $(DEPDIR)/shpdata-shpgeo.Tpo -c -o shpdata-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdata-shpgeo.Tpo $(DEPDIR)/shpdata-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpdata-shpgeo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdata-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` + +shpdxf-shpdxf.o: shpdxf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdxf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdxf-shpdxf.o -MD -MP -MF $(DEPDIR)/shpdxf-shpdxf.Tpo -c -o shpdxf-shpdxf.o `test -f 'shpdxf.c' || echo '$(srcdir)/'`shpdxf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdxf-shpdxf.Tpo $(DEPDIR)/shpdxf-shpdxf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpdxf.c' object='shpdxf-shpdxf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdxf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdxf-shpdxf.o `test -f 'shpdxf.c' || echo '$(srcdir)/'`shpdxf.c + +shpdxf-shpdxf.obj: shpdxf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdxf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdxf-shpdxf.obj -MD -MP -MF $(DEPDIR)/shpdxf-shpdxf.Tpo -c -o shpdxf-shpdxf.obj `if test -f 'shpdxf.c'; then $(CYGPATH_W) 'shpdxf.c'; else $(CYGPATH_W) '$(srcdir)/shpdxf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdxf-shpdxf.Tpo $(DEPDIR)/shpdxf-shpdxf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpdxf.c' object='shpdxf-shpdxf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdxf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdxf-shpdxf.obj `if test -f 'shpdxf.c'; then $(CYGPATH_W) 'shpdxf.c'; else $(CYGPATH_W) '$(srcdir)/shpdxf.c'; fi` + +shpfix-shpfix.o: shpfix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpfix_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpfix-shpfix.o -MD -MP -MF $(DEPDIR)/shpfix-shpfix.Tpo -c -o shpfix-shpfix.o `test -f 'shpfix.c' || echo '$(srcdir)/'`shpfix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpfix-shpfix.Tpo $(DEPDIR)/shpfix-shpfix.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpfix.c' object='shpfix-shpfix.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpfix_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpfix-shpfix.o `test -f 'shpfix.c' || echo '$(srcdir)/'`shpfix.c + +shpfix-shpfix.obj: shpfix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpfix_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpfix-shpfix.obj -MD -MP -MF $(DEPDIR)/shpfix-shpfix.Tpo -c -o shpfix-shpfix.obj `if test -f 'shpfix.c'; then $(CYGPATH_W) 'shpfix.c'; else $(CYGPATH_W) '$(srcdir)/shpfix.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpfix-shpfix.Tpo $(DEPDIR)/shpfix-shpfix.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpfix.c' object='shpfix-shpfix.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpfix_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpfix-shpfix.obj `if test -f 'shpfix.c'; then $(CYGPATH_W) 'shpfix.c'; else $(CYGPATH_W) '$(srcdir)/shpfix.c'; fi` + +shpinfo-shpinfo.o: shpinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpinfo-shpinfo.o -MD -MP -MF $(DEPDIR)/shpinfo-shpinfo.Tpo -c -o shpinfo-shpinfo.o `test -f 'shpinfo.c' || echo '$(srcdir)/'`shpinfo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpinfo-shpinfo.Tpo $(DEPDIR)/shpinfo-shpinfo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpinfo.c' object='shpinfo-shpinfo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpinfo-shpinfo.o `test -f 'shpinfo.c' || echo '$(srcdir)/'`shpinfo.c + +shpinfo-shpinfo.obj: shpinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpinfo-shpinfo.obj -MD -MP -MF $(DEPDIR)/shpinfo-shpinfo.Tpo -c -o shpinfo-shpinfo.obj `if test -f 'shpinfo.c'; then $(CYGPATH_W) 'shpinfo.c'; else $(CYGPATH_W) '$(srcdir)/shpinfo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpinfo-shpinfo.Tpo $(DEPDIR)/shpinfo-shpinfo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpinfo.c' object='shpinfo-shpinfo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpinfo-shpinfo.obj `if test -f 'shpinfo.c'; then $(CYGPATH_W) 'shpinfo.c'; else $(CYGPATH_W) '$(srcdir)/shpinfo.c'; fi` + +shpinfo-shpgeo.o: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpinfo-shpgeo.o -MD -MP -MF $(DEPDIR)/shpinfo-shpgeo.Tpo -c -o shpinfo-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpinfo-shpgeo.Tpo $(DEPDIR)/shpinfo-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpinfo-shpgeo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpinfo-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c + +shpinfo-shpgeo.obj: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpinfo-shpgeo.obj -MD -MP -MF $(DEPDIR)/shpinfo-shpgeo.Tpo -c -o shpinfo-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpinfo-shpgeo.Tpo $(DEPDIR)/shpinfo-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpinfo-shpgeo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpinfo-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` + +shpproj-shpproj.o: shpproj.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpproj-shpproj.o -MD -MP -MF $(DEPDIR)/shpproj-shpproj.Tpo -c -o shpproj-shpproj.o `test -f 'shpproj.c' || echo '$(srcdir)/'`shpproj.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpproj-shpproj.Tpo $(DEPDIR)/shpproj-shpproj.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpproj.c' object='shpproj-shpproj.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpproj-shpproj.o `test -f 'shpproj.c' || echo '$(srcdir)/'`shpproj.c + +shpproj-shpproj.obj: shpproj.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpproj-shpproj.obj -MD -MP -MF $(DEPDIR)/shpproj-shpproj.Tpo -c -o shpproj-shpproj.obj `if test -f 'shpproj.c'; then $(CYGPATH_W) 'shpproj.c'; else $(CYGPATH_W) '$(srcdir)/shpproj.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpproj-shpproj.Tpo $(DEPDIR)/shpproj-shpproj.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpproj.c' object='shpproj-shpproj.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpproj-shpproj.obj `if test -f 'shpproj.c'; then $(CYGPATH_W) 'shpproj.c'; else $(CYGPATH_W) '$(srcdir)/shpproj.c'; fi` + +shpproj-shpgeo.o: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpproj-shpgeo.o -MD -MP -MF $(DEPDIR)/shpproj-shpgeo.Tpo -c -o shpproj-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpproj-shpgeo.Tpo $(DEPDIR)/shpproj-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpproj-shpgeo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpproj-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c + +shpproj-shpgeo.obj: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpproj-shpgeo.obj -MD -MP -MF $(DEPDIR)/shpproj-shpgeo.Tpo -c -o shpproj-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpproj-shpgeo.Tpo $(DEPDIR)/shpproj-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpproj-shpgeo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpproj-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` + +shpsort-shpsort.o: shpsort.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpsort_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpsort-shpsort.o -MD -MP -MF $(DEPDIR)/shpsort-shpsort.Tpo -c -o shpsort-shpsort.o `test -f 'shpsort.c' || echo '$(srcdir)/'`shpsort.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpsort-shpsort.Tpo $(DEPDIR)/shpsort-shpsort.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpsort.c' object='shpsort-shpsort.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpsort_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpsort-shpsort.o `test -f 'shpsort.c' || echo '$(srcdir)/'`shpsort.c + +shpsort-shpsort.obj: shpsort.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpsort_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpsort-shpsort.obj -MD -MP -MF $(DEPDIR)/shpsort-shpsort.Tpo -c -o shpsort-shpsort.obj `if test -f 'shpsort.c'; then $(CYGPATH_W) 'shpsort.c'; else $(CYGPATH_W) '$(srcdir)/shpsort.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpsort-shpsort.Tpo $(DEPDIR)/shpsort-shpsort.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpsort.c' object='shpsort-shpsort.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpsort_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpsort-shpsort.obj `if test -f 'shpsort.c'; then $(CYGPATH_W) 'shpsort.c'; else $(CYGPATH_W) '$(srcdir)/shpsort.c'; fi` + +shpwkb-shpwkb.o: shpwkb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpwkb-shpwkb.o -MD -MP -MF $(DEPDIR)/shpwkb-shpwkb.Tpo -c -o shpwkb-shpwkb.o `test -f 'shpwkb.c' || echo '$(srcdir)/'`shpwkb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpwkb-shpwkb.Tpo $(DEPDIR)/shpwkb-shpwkb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpwkb.c' object='shpwkb-shpwkb.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpwkb-shpwkb.o `test -f 'shpwkb.c' || echo '$(srcdir)/'`shpwkb.c + +shpwkb-shpwkb.obj: shpwkb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpwkb-shpwkb.obj -MD -MP -MF $(DEPDIR)/shpwkb-shpwkb.Tpo -c -o shpwkb-shpwkb.obj `if test -f 'shpwkb.c'; then $(CYGPATH_W) 'shpwkb.c'; else $(CYGPATH_W) '$(srcdir)/shpwkb.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpwkb-shpwkb.Tpo $(DEPDIR)/shpwkb-shpwkb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpwkb.c' object='shpwkb-shpwkb.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpwkb-shpwkb.obj `if test -f 'shpwkb.c'; then $(CYGPATH_W) 'shpwkb.c'; else $(CYGPATH_W) '$(srcdir)/shpwkb.c'; fi` + +shpwkb-shpgeo.o: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpwkb-shpgeo.o -MD -MP -MF $(DEPDIR)/shpwkb-shpgeo.Tpo -c -o shpwkb-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpwkb-shpgeo.Tpo $(DEPDIR)/shpwkb-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpwkb-shpgeo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpwkb-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c + +shpwkb-shpgeo.obj: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpwkb-shpgeo.obj -MD -MP -MF $(DEPDIR)/shpwkb-shpgeo.Tpo -c -o shpwkb-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpwkb-shpgeo.Tpo $(DEPDIR)/shpwkb-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpwkb-shpgeo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpwkb-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +Shape_PointInPoly-Shape_PointInPoly.o: Shape_PointInPoly.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Shape_PointInPoly_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Shape_PointInPoly-Shape_PointInPoly.o -MD -MP -MF $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Tpo -c -o Shape_PointInPoly-Shape_PointInPoly.o `test -f 'Shape_PointInPoly.cpp' || echo '$(srcdir)/'`Shape_PointInPoly.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Tpo $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Shape_PointInPoly.cpp' object='Shape_PointInPoly-Shape_PointInPoly.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Shape_PointInPoly_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Shape_PointInPoly-Shape_PointInPoly.o `test -f 'Shape_PointInPoly.cpp' || echo '$(srcdir)/'`Shape_PointInPoly.cpp + +Shape_PointInPoly-Shape_PointInPoly.obj: Shape_PointInPoly.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Shape_PointInPoly_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Shape_PointInPoly-Shape_PointInPoly.obj -MD -MP -MF $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Tpo -c -o Shape_PointInPoly-Shape_PointInPoly.obj `if test -f 'Shape_PointInPoly.cpp'; then $(CYGPATH_W) 'Shape_PointInPoly.cpp'; else $(CYGPATH_W) '$(srcdir)/Shape_PointInPoly.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Tpo $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Shape_PointInPoly.cpp' object='Shape_PointInPoly-Shape_PointInPoly.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Shape_PointInPoly_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Shape_PointInPoly-Shape_PointInPoly.obj `if test -f 'Shape_PointInPoly.cpp'; then $(CYGPATH_W) 'Shape_PointInPoly.cpp'; else $(CYGPATH_W) '$(srcdir)/Shape_PointInPoly.cpp'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +tests/shpproj.sh.log: tests/shpproj.sh + @p='tests/shpproj.sh'; \ + b='tests/shpproj.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +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 "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$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 + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; 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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-binPROGRAMS clean-generic clean-libtool 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 + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +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 \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ + clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + 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 mostlyclean-libtool pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS + +.PRECIOUS: Makefile + + +# 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/support/ShapeLib/contrib/ShapeFileII.pas b/support/ShapeLib/contrib/ShapeFileII.pas new file mode 100644 index 00000000..b7d0b7f3 --- /dev/null +++ b/support/ShapeLib/contrib/ShapeFileII.pas @@ -0,0 +1,239 @@ +{ +/****************************************************************************** + * $Id: ShapeFileII.pas,v 1.4 2016-12-05 12:44:07 erouault Exp $ + * + * Project: Shapelib + * Purpose: Delphi Pascal interface to Shapelib. + * Author: Kevin Meyer (Kevin@CyberTracker.co.za) + * + ****************************************************************************** + * Copyright (c) 2002, Keven Meyer (Kevin@CyberTracker.co.za) + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: ShapeFileII.pas,v $ + * Revision 1.4 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.3 2003-05-14 20:04:51 warmerda + * Changed fpSHP and fpSHX to integer at suggestion of Ivan Lucena. + * + * Revision 1.2 2002/01/21 14:09:26 warmerda + * Fixed name. + * + * Revision 1.1 2002/01/17 14:30:37 warmerda + * New + * + */ +} +unit ShapeFileII; + +interface +//uses { uses clause } +// ; +{ Set compiler to pack on byte boundaries only } +{$ALIGN OFF} +{$OVERFLOWCHECKS OFF} +{$J-} +const + SHPT_NULL = 0; + SHPT_POINT = 1; + SHPT_ARC = 3; + SHPT_POLYGON = 5; + SHPT_MULTIPOINT = 8; + SHPT_POINTZ = 11; + SHPT_ARCZ = 13; + SHPT_POLYGONZ = 15; + SHPT_MULTIPOINTZ = 18; + SHPT_POINTM = 21; + SHPT_ARCM = 23; + SHPT_POLYGONM = 25; + SHPT_MULTIPOINTM = 28; + SHPT_MULTIPATCH = 31; + XBASE_FLDHDR_SZ = 32; + szAccessBRW = 'rb+'; + +// *********************** SHP support ************************ + +type +SHPObject = record + nSHPType, + nShapeId, + nParts : LongWord; + panPartStart, + panPartType : array of LongWord; + nVertices : LongWord; + padfX, padfY, padfZ, padfM : array of double; + dfXMin, dfYMin, dfZMin, dfMMin : double; + dfXMax, dfYMax, dfZMax, dfMMax : double; +end; +SHPObjectHandle = ^SHPObject; + +SHPBoundsArr = double; + +SHPInfo = record + fpSHP, + fpSHX : integer; + + nShapeType, + nFileSize, + nRecords, + nMaxRecords : LongWord; + panRecOffset, + panRecSize : array of LongWord; + adBoundsMin, adBoundsMax : SHPBoundsArr; + bUpdated : LongWord; +end; +SHPHandle = ^SHPInfo; + +// *********************** DBF support ************************ + +DBFInfo = record + fp : FILE; + nRecords, + nRecordLength, + nHeaderLength, + nFields : LongWord; + + panFieldOffset, + panFieldSize, + panFieldDecimals : array of LongWord; + + pachFieldType : LongWord; + pszHeader : PChar; + nCurrentRecord, + bCurrentRecordModified : LongWord; + pszCurrentRecord : PChar; + + bNoHeader, + bUpdated : LongWord; +end; +DBFHandle = ^DBFInfo; + +DBFFieldType = (DBFTString, DBFTInteger, DBFTDouble, DBFTInvalid) ; + +// *********************** SHP func declarations ************************ + +{$ALIGN ON} + +function SHPOpen(pszShapeFile, pszAccess : PChar) : SHPHandle;cdecl; +procedure SHPGetInfo(hSHP : SHPHandle; var pnEntities, pnShapeType : LongWord; var padfMinBoud, padfMaxBound : SHPBoundsArr);cdecl; +procedure SHPClose(hSHP : SHPHandle);cdecl; +function SHPReadObject(hSHP : SHPHandle; iShape : LongWord): SHPObjectHandle;cdecl; +function SHPCreate(pszShapeFile : PChar; nShapeType : LongWord):SHPHandle;cdecl; +function SHPWriteObject(hSHP : SHPHandle; iShape : LongWord; psObject : SHPObjectHandle): LongWord;cdecl; +function SHPCreateSimpleObject(nSHPType, nVertices : LongWord; var padfX, padfY, padfZ : double):SHPObjectHandle;cdecl; +procedure SHPDestroy(psObject : SHPObjectHandle);cdecl; + +procedure SHPComputeExtents(psObject : SHPObjectHandle);cdecl; +function SHPCreateObject(nSHPType, iShape, nParts : LongWord; var panPartStart, panPartType : LongWord; nVertices : LongWord; var padfX, padfY, padfZ, padfM : SHPBoundsArr): SHPObjectHandle;cdecl; + +function SHPTypeStr(pnShapeType : LongWord): string; + +// *********************** DBF func declarations ************************ + +function DBFOpen(pszDBFFile, pszAccess : PChar): DBFHandle;cdecl; +function DBFCreate(pszDBFFile : PChar): DBFHandle ;cdecl; +function DBFGetFieldCount(hDBF : DBFHandle) : LongWord ;cdecl; +function DBFGetRecordCount(hDBF : DBFHandle) : LongWord;cdecl; +function DBFGetFieldIndex(hDBF: DBFHandle; pszFieldName : PChar): LongWord;cdecl; +function DBFGetFieldInfo(hDBF : DBFHandle; iField : LongWord; pszFieldName : PChar; + var pnWidth, pnDecimals : LongWord): DBFFieldType;cdecl; +function DBFAddField(hDBF : DBFHandle; pszFieldName : PChar; + eType : DBFFieldType; nWidth, nDecimals : LongWord): LongWord;cdecl; + +function DBFReadIntegerAttribute(hDBF : DBFHandle;iShape, iField : LongWord ): LongWord;cdecl; +function DBFReadDoubleAttribute(hDBF : DBFHandle; iShape, iField : LongWord ):double;cdecl; +function DBFReadStringAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : pchar;cdecl; +function DBFIsAttributeNULL(hDBF : DBFHandle; iShape, iField : LongWord ): LongWord;cdecl; +function DBFWriteIntegerAttribute(hDBF : DBFHandle;iShape, iField, nFieldValue : LongWord): LongWord;cdecl; +function DBFWriteDoubleAttribute(hDBF : DBFHandle;iShape, iField : LongWord; + dFieldValue : double): LongWord ;cdecl; +function DBFWriteStringAttribute(hDBF : DBFHandle;iShape, iField : LongWord; + pszFieldValue : PChar): LongWord ;cdecl; +function DBFWriteNULLAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : LongWord;cdecl; +procedure DBFClose(hDBF : DBFHandle);cdecl; +function DBFGetNativeFieldType(hDBF : DBFHandle; iField : LongWord) : Char;cdecl; + +// *********************** SHP implementation ************************ +implementation +// ***************************************************************************** +function SHPCreateSimpleObject(nSHPType, nVertices : LongWord; var padfX, padfY, padfZ : double):SHPObjectHandle;external 'shapelib.dll' name 'SHPCreateSimpleObject'; +function SHPOpen(pszShapeFile, pszAccess : PChar) : SHPHandle; external 'shapelib.dll' name 'SHPOpen'; +procedure SHPGetInfo(hSHP : SHPHandle; var pnEntities, pnShapeType : LongWord; var padfMinBoud, padfMaxBound : SHPBoundsArr);external 'shapelib.dll' name 'SHPGetInfo'; +procedure SHPClose(hSHP : SHPHandle);external 'shapelib.dll' name 'SHPClose'; +function SHPReadObject(hSHP : SHPHandle; iShape : LongWord) : SHPObjectHandle;external 'shapelib.dll' name 'SHPReadObject'; +function SHPCreate(pszShapeFile : PChar; nShapeType : LongWord):SHPHandle;external 'shapelib.dll' name 'SHPCreate'; +function SHPWriteObject(hSHP : SHPHandle; iShape : LongWord; psObject : SHPObjectHandle): LongWord;cdecl;external 'shapelib.dll' name 'SHPWriteObject'; +procedure SHPDestroy(psObject : SHPObjectHandle);external 'shapelib.dll' name 'SHPDestroyObject'; +procedure SHPComputeExtents(psObject : SHPObjectHandle);external 'shapelib.dll' name 'SHPComputeExtents'; +function SHPCreateObject(nSHPType, iShape, nParts : LongWord; var panPartStart, panPartType : LongWord; nVertices : LongWord; var padfX, padfY, padfZ, padfM : SHPBoundsArr): SHPObjectHandle;external 'shapelib.dll' name 'SHPCreateObject'; +// ***************************************************************************** +function SHPTypeStr(pnShapeType : LongWord): string; +begin + case pnShapeType of + SHPT_NULL : result := 'NULL'; + SHPT_POINT : result := 'POINT'; + SHPT_ARC : result := 'ARC'; + SHPT_POLYGON : result := 'POLYGON'; + SHPT_MULTIPOINT : result := 'MULTIPOINT'; + SHPT_POINTZ : result := 'POINTZ'; + SHPT_ARCZ : result := 'ARCZ'; + SHPT_POLYGONZ : result := 'POLYGONZ'; + SHPT_MULTIPOINTZ : result := 'MULTIPOINTZ'; + SHPT_POINTM : result := 'POINTM'; + SHPT_ARCM : result := 'ARCM'; + SHPT_POLYGONM : result := 'POLYGONM'; + SHPT_MULTIPOINTM : result := 'MULTIPOINTM'; + SHPT_MULTIPATCH : result := 'MULTIPATCH'; + else + result := '--unknown--'; + end; +end; +// ***************************************************************************** +// ***************************************************************************** +function DBFOpen(pszDBFFile, pszAccess : PChar): DBFHandle;external 'shapelib.dll'; +function DBFCreate(pszDBFFile : PChar): DBFHandle ;external 'shapelib.dll'; +function DBFGetFieldCount(hDBF : DBFHandle) : LongWord ;external 'shapelib.dll'; +function DBFGetRecordCount(hDBF : DBFHandle) : LongWord;external 'shapelib.dll'; +function DBFGetFieldIndex(hDBF: DBFHandle; pszFieldName : PChar): LongWord;external 'shapelib.dll'; +function DBFGetFieldInfo(hDBF : DBFHandle; iField : LongWord; pszFieldName : PChar; var pnWidth, pnDecimals : LongWord): DBFFieldType;external 'shapelib.dll'; +function DBFAddField(hDBF : DBFHandle; pszFieldName : PChar; eType : DBFFieldType; nWidth, nDecimals : LongWord): LongWord;external 'shapelib.dll'; +function DBFReadIntegerAttribute(hDBF : DBFHandle;iShape, iField : LongWord ): LongWord;external 'shapelib.dll'; +function DBFReadDoubleAttribute(hDBF : DBFHandle; iShape, iField : LongWord ):double;external 'shapelib.dll'; +function DBFReadStringAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : pchar;external 'shapelib.dll'; +function DBFIsAttributeNULL(hDBF : DBFHandle; iShape, iField : LongWord ): LongWord;external 'shapelib.dll'; +function DBFWriteIntegerAttribute(hDBF : DBFHandle;iShape, iField, nFieldValue : LongWord): LongWord;external 'shapelib.dll'; +function DBFWriteDoubleAttribute(hDBF : DBFHandle;iShape, iField : LongWord; dFieldValue : double): LongWord ;external 'shapelib.dll'; +function DBFWriteStringAttribute(hDBF : DBFHandle;iShape, iField : LongWord; pszFieldValue : PChar): LongWord ;external 'shapelib.dll'; +function DBFWriteNULLAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : LongWord;external 'shapelib.dll'; +procedure DBFClose(hDBF : DBFHandle);external 'shapelib.dll'; +function DBFGetNativeFieldType(hDBF : DBFHandle; iField : LongWord) : Char;external 'shapelib.dll'; +// ***************************************************************************** + +end. diff --git a/support/ShapeLib/contrib/Shape_PointInPoly.cpp b/support/ShapeLib/contrib/Shape_PointInPoly.cpp new file mode 100644 index 00000000..010fa260 --- /dev/null +++ b/support/ShapeLib/contrib/Shape_PointInPoly.cpp @@ -0,0 +1,243 @@ +/****************************************************************************** + * $Id: Shape_PointInPoly.cpp,v 1.2 2016-12-05 12:44:07 erouault Exp $ + * + * Project: Shapelib + * Purpose: Commandline program to generate points-in-polygons from a + * shapefile as a shapefile. + * Author: Marko Podgorsek, d-mon@siol.net + * + ****************************************************************************** + * Copyright (c) 2004, Marko Podgorsek, d-mon@siol.net + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: Shape_PointInPoly.cpp,v $ + * Revision 1.2 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.1 2004-01-09 16:47:57 fwarmerdam + * New + * + */ + +static char rcsid[] = + "$Id: Shape_PointInPoly.cpp,v 1.2 2016-12-05 12:44:07 erouault Exp $"; + +#include +#include +#include +#include + +#define MAXINTERSECTIONPOINTS 255 + +enum loopDir { + kExterior, + kInterior, + kError +}; + +struct DPoint2d +{ + DPoint2d() + { + x = y = 0.0; + }; + DPoint2d(double x, double y) + { + this->x = x; + this->y = y; + }; + double x,y; +}; + +struct IntersectPoint +{ + IntersectPoint(void) + { + x = y = 0.0; + boundry_nmb = 0; + loopdirection = kError; + }; + double x,y; + int boundry_nmb; + loopDir loopdirection; +}; + +loopDir LoopDirection(DPoint2d *vertices, int vertsize) +{ + int i; + double sum = 0.0; + for(i=0;i0) + return kInterior; + else + return kExterior; +} + +DPoint2d CreatePointInPoly(SHPObject *psShape, int quality) +{ + int i, j, k, end, vert, pointpos; + double part, dx, xmin, xmax, ymin, ymax, y, x3, x4, y3, y4, len, maxlen = 0; + DPoint2d *vertices; + loopDir direction; + IntersectPoint mp1, mp2, point1, point2, points[MAXINTERSECTIONPOINTS]; + + xmin = psShape->dfXMin; + ymin = psShape->dfYMin; + xmax = psShape->dfXMax; + ymax = psShape->dfYMax; + part = (ymax-ymin)/(quality+1); + dx = xmax-xmin; + for(i=0;inParts;j++) + { + if(j==psShape->nParts-1) + end = psShape->nVertices; + else + end = psShape->panPartStart[j+1]; + vertices = new DPoint2d [end-psShape->panPartStart[j]]; + for(k=psShape->panPartStart[j],vert=0;kpadfX[k]; + vertices[vert++].y = psShape->padfY[k]; + } + direction = LoopDirection(vertices, vert); + for(k=0;k= y && y4 < y) || (y3 <= y && y4 > y)) //I check >= only once, because if it's not checked now (y3) it will be in the next iteration (which is y4 now) + { + point1.boundry_nmb = j; + point1.loopdirection = direction; + x3 = vertices[k].x; + x4 = vertices[k+1].x; + if(y3==y) + { + point1.y = y3; + point1.x = x3; + if(direction == kInterior) //add point 2 times if the direction is interior, so that the final count of points is even + { + points[pointpos++]=point1; + } + } + else + { + point1.x = xmin+(((((x4-x3)*(y-y3))-((y4-y3)*(xmin-x3)))/((y4-y3)*dx))*dx); //striped down calculation of intersection of 2 lines + point1.y = y; + } + points[pointpos++]=point1; + } + } + delete [] vertices; + } + + for(j=1;j0;k--) + { + if(points[k].x < points[k-1].x) + { + point1 = points[k]; + points[k] = points[k-1]; + points[k-1] = point1; + } + else + { + break; + } + } + } + + for(j=0;j= maxlen) + { + maxlen = len; + mp1 = point1; + mp2 = point2; + } + } + } + } + + return DPoint2d((mp1.x+mp2.x)*0.5, (mp1.y+mp2.y)*0.5); +} + +int main(int argc, char* argv[]) +{ + if(argc != 3) + { + printf("Usage: %s shpfile_path quality\n", argv[0]); + return 1; + } + + int i, nEntities, quality; + SHPHandle hSHP; + SHPObject *psShape; + DPoint2d pt; + quality = atoi(argv[2]); + hSHP = SHPOpen(argv[1], "rb"); + SHPGetInfo(hSHP, &nEntities, NULL, NULL, NULL); + + printf("PointInPoly v1.0, by Marko Podgorsek\n----------------\n"); + for( i = 0; i < nEntities; i++ ) + { + psShape = SHPReadObject( hSHP, i ); + if(psShape->nSHPType == SHPT_POLYGON) + { + pt = CreatePointInPoly(psShape, quality); + printf("%d: x=%f y=%f\n",i, pt.x,pt.y); + } + SHPDestroyObject( psShape ); + } + + SHPClose(hSHP); + + return 0; +} + diff --git a/support/ShapeLib/contrib/dbfcat.c b/support/ShapeLib/contrib/dbfcat.c new file mode 100644 index 00000000..2c4eb9ff --- /dev/null +++ b/support/ShapeLib/contrib/dbfcat.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 1995 Frank Warmerdam + * + * This code is in the public domain. + * + * $Log: dbfcat.c,v $ + * Revision 1.2 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.1 1999-05-26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * Revision 1.3 1995/10/21 03:15:01 warmerda + * Changed to use binary file access. + * + * Revision 1.2 1995/08/04 03:16:22 warmerda + * Added header. + * + */ + +static char rcsid[] = + "$Id: dbfcat.c,v 1.2 2011-07-24 03:17:46 fwarmerdam Exp $"; + +#include +#include +#include "shapefil.h" + +int main( int argc, char ** argv ) + +{ + DBFHandle hDBF; + int *panWidth, i, iRecord; + char szFormat[32], szField[1024]; + char cTitle[32], nTitle[32]; + int nWidth, nDecimals; + int cnWidth, cnDecimals; + DBFHandle cDBF; + DBFFieldType hType,cType; + int ci, ciRecord; + char tfile[160]; + int hflds, j, cflds; + int verbose = 0; + int force = 0; + int mismatch = 0; + int matches = 0; + char fld_m[256]; + int shift = 0; + char type_names[4][15] = {"integer", "string", "double", "double"}; + + if( argc < 3 ) + { + printf( "dbfcat [-v] [-f] from_DBFfile to_DBFfile\n" ); + exit( 1 ); + } + + + if ( strcmp ("-v", argv[1] ) == 0 ) { shift = 1; verbose = 1; } + if ( strcmp ("-f", argv[1 + shift] ) == 0 ) { shift ++; force = 1; } + if ( strcmp ("-v", argv[1 + shift] ) == 0 ) { shift ++; verbose = 1; } + strcpy (tfile, argv[1 + shift]); + strcat (tfile, ".dbf"); + hDBF = DBFOpen( tfile, "rb" ); + if( hDBF == NULL ) + { + printf( "DBFOpen(%s.dbf,\"r\") failed for From_DBF.\n", tfile ); + exit( 2 ); + } + + strcpy (tfile, argv[2 + shift]); + strcat (tfile, ".dbf"); + + cDBF = DBFOpen( tfile, "rb+" ); + if( cDBF == NULL ) + { + printf( "DBFOpen(%s.dbf,\"rb+\") failed for To_DBF.\n", tfile ); + exit( 2 ); + } + + + if( DBFGetFieldCount(hDBF) == 0 ) + { + printf( "There are no fields in this table!\n" ); + exit( 3 ); + } + + hflds = DBFGetFieldCount(hDBF); + cflds = DBFGetFieldCount(cDBF); + + matches = 0; + for( i = 0; i < hflds; i++ ) + { + char szTitle[18]; + char cname[18]; + int j; + hType = DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals ); + fld_m[i] = -1; + for ( j = 0; j < cflds; j ++ ) + { + cType = DBFGetFieldInfo( cDBF, j, cname, &cnWidth, &cnDecimals ); + if ( strcmp (cname, szTitle) == 0 ) + { + if ( hType != cType ) + { printf ("Incompatible fields %s(%s) != %s(%s),\n", + type_names[hType],nTitle,type_names[cType],cTitle); + mismatch = 1; + } + fld_m[i] = j; + if ( verbose ) + { printf("%s %s(%d,%d) <- %s %s(%d,%d)\n", cname, type_names[cType], + cnWidth, cnDecimals, + szTitle, type_names[hType], nWidth, nDecimals); } + j = cflds; + matches = 1; + } + } + } + + if ( (matches == 0 ) && !force ) { + printf ("ERROR: No field names match for tables, cannot proceed\n use -f to force processing using blank records\n"); + exit(-1); } + if ( mismatch && !force ) { + printf ("ERROR: field type mismatch cannot proceed\n use -f to force processing using attempted conversions\n"); + exit(-1); } + + for( iRecord = 0; iRecord < DBFGetRecordCount(hDBF); iRecord++ ) + { + ciRecord = DBFGetRecordCount( cDBF ); + for ( i = 0; i < hflds;i ++ ) + { + double cf; + ci = fld_m[i]; + if ( ci != -1 ) + { + cType = DBFGetFieldInfo( cDBF, ci, cTitle, &cnWidth, &cnDecimals ); + hType = DBFGetFieldInfo( hDBF, i, nTitle, &nWidth, &nDecimals ); + + switch( cType ) + { + case FTString: + DBFWriteStringAttribute(cDBF, ciRecord, ci, + (char *) DBFReadStringAttribute( hDBF, iRecord, i ) ); + break; + + case FTInteger: + DBFWriteIntegerAttribute(cDBF, ciRecord, ci, + (int) DBFReadIntegerAttribute( hDBF, iRecord, i ) ); + break; + + case FTDouble: +/* cf = DBFReadDoubleAttribute( hDBF, iRecord, i ); + printf ("%s <- %s (%f)\n", cTitle, nTitle, cf); +*/ + DBFWriteDoubleAttribute(cDBF, ciRecord, ci, + (double) DBFReadDoubleAttribute( hDBF, iRecord, i ) ); + break; + } + } + } /* fields names match */ + } + + if ( verbose ) { printf (" %d records appended \n\n", iRecord); } + DBFClose( hDBF ); + DBFClose( cDBF ); + + return( 0 ); +} diff --git a/support/ShapeLib/contrib/dbfinfo.c b/support/ShapeLib/contrib/dbfinfo.c new file mode 100644 index 00000000..6916dd5c --- /dev/null +++ b/support/ShapeLib/contrib/dbfinfo.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 1999 Carl Anderson + * + * This code is in the public domain. + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * requires shapelib 1.2 + * gcc dbfinfo dbfopen.o dbfinfo + * + * + * $Log: dbfinfo.c,v $ + * Revision 1.4 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.3 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.2 1999-05-26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * + */ + +#include +#include +#include "shapefil.h" + +int main( int argc, char ** argv ) + +{ + DBFHandle hDBF; + int *panWidth, i, iRecord; + char szFormat[32], szField[1024]; + char ftype[32], cTitle[32], nTitle[32]; + int nWidth, nDecimals; + int cnWidth, cnDecimals; + DBFHandle cDBF; + DBFFieldType hType,cType; + int ci, ciRecord; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 2 ) + { + printf( "dbfinfo xbase_file\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the file. */ +/* -------------------------------------------------------------------- */ + hDBF = DBFOpen( argv[1], "rb" ); + if( hDBF == NULL ) + { + printf( "DBFOpen(%s,\"r\") failed.\n", argv[1] ); + exit( 2 ); + } + + printf ("Info for %s\n",argv[1]); + +/* -------------------------------------------------------------------- */ +/* If there is no data in this file let the user know. */ +/* -------------------------------------------------------------------- */ + i = DBFGetFieldCount(hDBF); + printf ("%d Columns, %d Records in file\n",i,DBFGetRecordCount(hDBF)); + +/* -------------------------------------------------------------------- */ +/* Compute offsets to use when printing each of the field */ +/* values. We make each field as wide as the field title+1, or */ +/* the field value + 1. */ +/* -------------------------------------------------------------------- */ + panWidth = (int *) malloc( DBFGetFieldCount( hDBF ) * sizeof(int) ); + + for( i = 0; i < DBFGetFieldCount(hDBF); i++ ) + { + char szTitle[12]; + DBFFieldType eType; + + switch ( DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals )) { + case FTString: + strcpy (ftype, "string");; + break; + + case FTInteger: + strcpy (ftype, "integer"); + break; + + case FTDouble: + strcpy (ftype, "float"); + break; + + case FTInvalid: + strcpy (ftype, "invalid/unsupported"); + break; + + default: + strcpy (ftype, "unknown"); + break; + } + printf ("%15.15s\t%15s (%d,%d)\n",szTitle, ftype, nWidth, nDecimals); + + } + + DBFClose( hDBF ); + + return( 0 ); +} diff --git a/support/ShapeLib/contrib/doc/Shape_PointInPoly_README.txt b/support/ShapeLib/contrib/doc/Shape_PointInPoly_README.txt new file mode 100644 index 00000000..ed4ff8ed --- /dev/null +++ b/support/ShapeLib/contrib/doc/Shape_PointInPoly_README.txt @@ -0,0 +1,59 @@ +=============================================================================== +Project: Shape_PoinInPoly +Purpose: Sample and the function for calculatin a point in a polygon + (complex,compound - it doesn't matter). Can be used for labeling. +Author: Copyright (c) 2004, Marko Podgorsek, d-mon@siol.net +=============================================================================== +Requires: shapelib 1.2 (http://shapelib.maptools.org/) +Tested and created on platform: + Windows 2000 Professional + Visual Studio .NET 7.0 + P4 2.4 GHz + 1GB RAM + +I just found out about the ShapeLib, GDAL and OGR and I must say that they're +all great projects. +I belive I'll use some of those libraries in the future. Right now I'm using +only shapelib. +The thing that led me to the http://wwww.maptools.org was the need of finding +the point in poly...but as I found out that even OGR didn't support it. So +there I was. I was forced to make my own function. Well, it was fun. I learned +a lot. +I wrote this function for the Autodesk Autocad 2004 MPolygon, because there was +no function to do this in the Object Arx SDK (the Acad programming SDK). Well, +it will be in the 2005 release...but, still. There is a function in the +Autodesk Map 2004 version...in the menu. +Not useful when you need the coordinates, not the point on the screen... +So when the Acad version was done I was thinking of doing it on the Shape files, +too. A little bit of changing the structures and variable +types (so they're not using Object Arx) and I was done. +And here it is....Contribution from me to the ShapeLib world :)...and maybe even +OGR (a little bit of changing there). + +Some statistics: +For about 69000 polygons in Autocad picture (.dwg files) +Autodesk Map 2004 was creating centroids (the menu command) about 45s (1 scan +line) +My function, with 3 scan lines took about 5s. And I was drawing the dots on the +picture... + +------------------------------------------------------------------------------- +DPoint2d CreatePointInPoly(SHPObject *psShape, int quality) + +The second parameter quality tell the function just how many rays shall it use +to get the point. +quality = 3 works very well, but anything below 5 is good. +This doesn't mean that the execution will slow down, but it just finds a good +point. That's all. + +The qality shows on the compound objects (multiple poligons with more than one +exterior loop) - if not enough rays, then there may be no centroid. +Or the U shaped thin polygon, only the bootom (below the y center line) is fat. +Autodesk Map with one scan line will create the centroid on one of the thin +parts, because it only uses the y center line. If you have more rays, one will +surely pass the fat area and centroid will be created there. + +------------------------------------------------------------------------------- +Anyone using this function: +Just send me an e-mail, so I'll see if I did anything good for the public. +And you can send me e-mail with questions also. diff --git a/support/ShapeLib/contrib/doc/shpproj.txt b/support/ShapeLib/contrib/doc/shpproj.txt new file mode 100644 index 00000000..d289562e --- /dev/null +++ b/support/ShapeLib/contrib/doc/shpproj.txt @@ -0,0 +1,71 @@ + + +shpproj + + + +using the projection tools proj and invproj +we have implemented a shapefile projection utility + +shpproj shp_file new_shp ( -i=in_proj_file | -i="in_params" | -i=geographic ) ( -o=out_info_file | -o="out_params" | -o=geographic ) + +INPUT + Input can come from one of three sources. A projection parameter file, + directly through parameters or geographic. If the shapefile has an associated + prj file, name the same as the shapefile but ending in ".prj" it will be used + by default ignoring all other parameters. If input is omitted it defaults to + geographic, unless the default prj file exists.. + +OUTPUT + Output can come from one of three sources. A projection parameter file, + directly through parameters or geographic. If output is omitted it defaults + to geographic. + +PROJECTION PARAMETER FILE + This file MUST end with the extension ".prj". It has the form of one + projection parameter per line. Parameters can be in any order. + +PROJECTION PARAMETERS + Are the same as used by proj and invproj. + use proj -lP to see available projections + proj -lu to see available units + proj -le to see available ellipsoid + + +USAGE + +the following example projects file rowtest to row3, moving data from Stateplane NAD83 zone 1002 to utm zone 16 in meters + +shpproj rowtest row -i="init=nad83:1002 units=us-ft" -o="proj=utm zone=16 units=m" + +shpproj rowtest row3 -o="proj=utm zone=18 units=m" -i="zone=16 proj=utm units=us-ft" + +shpproj rowtest row3 -o="proj=utm zone=18 units=m" + +shpproj rowtest row3 -i=myfile.prj -o=geographic +shpproj rowtest row3 -is=myfile.prj + + +Datums +Stateplane data can be accessed by the init function + init=nad83:1003 +which is of the form + datum:FIPSzone + +To move from NAD27 to NAD83 or otherwise the shpproj utility moves to +geographic coordinates and the back to the desired datum. proj can handle +direct datum to datum conversions but it is umimplemented here. + +for a complete listing of FIPSZones by datum read nad/nad.lst in the PROJ4 +library + + +CAUTION + +It is possible to get very poor results for projection values when using +coordinates VERY far away from the intended scope of the projection. + +An example of a poor projection choice would be to move from nad83:1002 +(Georgia West) for data in California into utm. The resulting data will be +much less accurate than if it had started as geographic. + diff --git a/support/ShapeLib/contrib/doc/shpsort.txt b/support/ShapeLib/contrib/doc/shpsort.txt new file mode 100644 index 00000000..90651d27 --- /dev/null +++ b/support/ShapeLib/contrib/doc/shpsort.txt @@ -0,0 +1,44 @@ +============================= ABOUT =========================================== + +The program "shpsort" is a standalone program for sorting shapefiles +on one or more fields (including the pseudofield "SHAPE") and outputing +the results. People may find it useful for forcing drawing order. + +============================= AUTHOR ========================================== + +Eric G. Miller +California Department of Fish and Game +2004-06-30 + +============================= USAGE =========================================== + +shpsort {SORT_ORDER;SORT_ORDER...} + +============================= DETAILS ========================================= + +INFILE The input shapefile + +OUTFILE The output shapefile + +SORT_FIELD Any attribute field of the shapefile, including "SHAPE" + +SORT_ORDER Specify "ASCENDING" or "DESCENDING" for each SORT_FIELD. + This field is optional, and is assumed to be ASCENDING + unless the exact word "DESCENDING" is specified (case + matters). + + When sorting on the "SHAPE" the records are sorted as follows: + + * Null shapes are treated as any other null field and will + sort to the top in ASCENDING mode. A warning is issued + for each null shape encountered. + * POINT, POINTM, POINTZ, MULTIPOINT, MULTIPOINTM, MULTIPOINTZ + and MULTIPATCH are all sorted by the maximum "Y" value of + their envelopes (not particularly useful). + * POLYLINE, POLYLINEZ and POLYLINEM are sorted by total 2d + shape length. + * POLYGON, POLYGONZ and POLYGONM are sorted by the 2d shape + area. Shapes are assumed to be in canonical ordering, so that + the area of interior rings (if any) is subtracted from the + area of exterior rings. + diff --git a/support/ShapeLib/contrib/makefile.vc b/support/ShapeLib/contrib/makefile.vc new file mode 100644 index 00000000..2612c7d4 --- /dev/null +++ b/support/ShapeLib/contrib/makefile.vc @@ -0,0 +1,34 @@ + +CFLAGS = /Ox /MD /nologo /I.. /IC:\OSGeo4W\include \ + /D_LITTLE_ENDIAN -DPROJ4 + +LINKARGS = ..\shapelib_i.lib C:\OSGeo4W\lib\proj_i.lib + +default: all + +all: shpcat.exe shpcentrd.exe shpdxf.exe shpinfo.exe shpproj.exe + +shpcat.exe: shpcat.obj shpgeo.obj + $(CC) $(CFLAGS) shpcat.obj $(LINKARGS) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpcentrd.exe: shpcentrd.obj shpgeo.obj + $(CC) $(CFLAGS) shpcentrd.obj shpgeo.obj $(LINKARGS) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpproj.exe: shpproj.obj shpgeo.obj + $(CC) $(CFLAGS) shpproj.obj shpgeo.obj $(LINKARGS) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpdxf.exe: shpdxf.obj shpgeo.obj + $(CC) $(CFLAGS) shpdxf.obj $(LINKARGS) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpinfo.exe: shpinfo.obj shpgeo.obj + $(CC) $(CFLAGS) shpinfo.obj $(LINKARGS) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +clean: + -del *.obj + -del *.exe + -del *.manifest diff --git a/support/ShapeLib/contrib/shpcat.c b/support/ShapeLib/contrib/shpcat.c new file mode 100644 index 00000000..d4c32df7 --- /dev/null +++ b/support/ShapeLib/contrib/shpcat.c @@ -0,0 +1,100 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * 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. + ****************************************************************************** + * + * shpcat + * + * gcc shpcat.c ../shpopen.o -o shpcat + * + * Utility program to concatenate two shapefiles + * Must be used in concert with dbfcat + * + */ + +#include +#include +#include "shapefil.h" + +int dbfcat_main( int argc, char ** argv ); + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP, cSHP; + int nShapeType, i, nEntities, nShpInFile; + SHPObject *shape; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 3 ) + { + printf( "shpcat from_shpfile to_shpfile\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( argv[1], "rb" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( hSHP, &nEntities, &nShapeType, NULL, NULL ); + fprintf(stderr,"Opened From File %s, with %d shapes\n",argv[1],nEntities); + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + cSHP = SHPOpen( argv[2], "rb+" ); + + if( cSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[2] ); + exit( 1 ); + } + + SHPGetInfo( cSHP, &nShpInFile, NULL, NULL, NULL ); + fprintf(stderr,"Opened to file %s with %d shapes, ready to add %d\n", + argv[2],nShpInFile,nEntities); + +/* -------------------------------------------------------------------- */ +/* Skim over the list of shapes, printing all the vertices. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < nEntities; i++ ) + { + shape = SHPReadObject( hSHP, i ); + SHPWriteObject( cSHP, -1, shape ); + SHPDestroyObject ( shape ); + + } + + SHPClose( hSHP ); + SHPClose( cSHP ); + + exit( 0 ); +} diff --git a/support/ShapeLib/contrib/shpcentrd.c b/support/ShapeLib/contrib/shpcentrd.c new file mode 100644 index 00000000..8156b9ee --- /dev/null +++ b/support/ShapeLib/contrib/shpcentrd.c @@ -0,0 +1,159 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * this code is based in part on the earlier work of Frank Warmerdam + * + * 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. + ****************************************************************************** + * + * shpcentrd.c - compute XY centroid for complex shapes + * and create a new SHPT_PT file of then + * specifically undo compound objects but not complex ones + * + * + * $Log: shpcentrd.c,v $ + * Revision 1.3 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.2 1999-05-26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * + * + */ + + +/* the centroid is defined as + * + * Cx = sum (x dArea ) / Total Area + * and + * Cy = sum (y dArea ) / Total Area + */ + +#include +#include +#include "shapefil.h" +#include "shpgeo.h" + +int main( int argc, char ** argv ) + +{ + SHPHandle old_SHP, new_SHP; + DBFHandle old_DBF, new_DBF; + int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart; + double *padVertices, adBounds[4]; + const char *pszPlus; + DBFFieldType idfld_type; + int idfld, nflds; + char kv[257] = ""; + char idfldName[120] = ""; + char fldName[120] = ""; + char shpFileName[120] = ""; + char dbfFileName[120] = ""; + double apeture[4]; + char *DBFRow = NULL; + int Cpan[2] = { 0,0 }; + int byRing = 1; + PT Centrd; + SHPObject *psCShape, *cent_pt; + + + if( argc < 3 ) + { + printf( "shpcentrd shp_file new_shp_file\n" ); + exit( 1 ); + } + + old_SHP = SHPOpen (argv[1], "rb" ); + old_DBF = DBFOpen (argv[1], "rb"); + if( old_SHP == NULL || old_DBF == NULL ) + { + printf( "Unable to open old files:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( old_SHP, &nEntities, &nShapeType, NULL, NULL ); + new_SHP = SHPCreate ( argv[2], SHPT_POINT ); + + new_DBF = DBFCloneEmpty (old_DBF, argv[2]); + if( new_SHP == NULL || new_DBF == NULL ) + { + printf( "Unable to create new files:%s\n", argv[2] ); + exit( 1 ); + } + + DBFRow = (char *) malloc ( (old_DBF->nRecordLength) + 15 ); + + +#ifdef DEBUG + printf ("ShpCentrd using shpgeo \n"); +#endif + + for( i = 0; i < nEntities; i++ ) + { + int res ; + + psCShape = SHPReadObject( old_SHP, i ); + + if ( byRing == 1 ) { + int ring; + for ( ring = 0; ring < psCShape->nParts; ring ++ ) { + SHPObject *psO; + psO = SHPClone ( psCShape, ring, ring + 1 ); + + Centrd = SHPCentrd_2d ( psO ); + + cent_pt = SHPCreateSimpleObject ( SHPT_POINT, 1, + (double*) &(Centrd.x), (double*) &(Centrd.y), NULL ); + + SHPWriteObject ( new_SHP, -1, cent_pt ); + + memcpy ( DBFRow, DBFReadTuple ( old_DBF, i ), + old_DBF->nRecordLength ); + DBFWriteTuple ( new_DBF, new_DBF->nRecords, DBFRow ); + + SHPDestroyObject ( cent_pt ); + + SHPDestroyObject ( psO ); + } + + } + else { + + Centrd = SHPCentrd_2d ( psCShape ); + + cent_pt = SHPCreateSimpleObject ( SHPT_POINT, 1, + (double*) &(Centrd.x), (double*) &(Centrd.y), NULL ); + + SHPWriteObject ( new_SHP, -1, cent_pt ); + + memcpy ( DBFRow, DBFReadTuple ( old_DBF, i ), + old_DBF->nRecordLength ); + DBFWriteTuple ( new_DBF, new_DBF->nRecords, DBFRow ); + + SHPDestroyObject ( cent_pt ); + } + } + + SHPClose( old_SHP ); + SHPClose( new_SHP ); + DBFClose( old_DBF ); + DBFClose( new_DBF ); + printf ("\n"); +} diff --git a/support/ShapeLib/contrib/shpdata.c b/support/ShapeLib/contrib/shpdata.c new file mode 100644 index 00000000..6ab60137 --- /dev/null +++ b/support/ShapeLib/contrib/shpdata.c @@ -0,0 +1,134 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * this code is based in part on the earlier work of Frank Warmerdam + * + * 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. + ****************************************************************************** + * + * shpdata.c - utility program for testing elements of the libraries + * + * + * $Log: shpdata.c,v $ + * Revision 1.3 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.2 1999-05-26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * + * + */ + +#include +#include "shapefil.h" +#include "shpgeo.h" + +int main( int argc, char ** argv ) + +{ + SHPHandle old_SHP, new_SHP; + DBFHandle old_DBF, new_DBF; + int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart; + double *padVertices, adBounds[4]; + const char *pszPlus; + DBFFieldType idfld_type; + int idfld, nflds; + char kv[257] = ""; + char idfldName[120] = ""; + char fldName[120] = ""; + char shpFileName[120] = ""; + char dbfFileName[120] = ""; + char *DBFRow = NULL; + int Cpan[2] = { 0,0 }; + int byRing = 1; + PT oCentrd, ringCentrd; + SHPObject *psCShape, *cent_pt; + double oArea = 0.0, oLen = 0.0; + + if( argc < 2 ) + { + printf( "shpdata shp_file \n" ); + exit( 1 ); + } + + old_SHP = SHPOpen (argv[1], "rb" ); + old_DBF = DBFOpen (argv[1], "rb"); + if( old_SHP == NULL || old_DBF == NULL ) + { + printf( "Unable to open old files:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( old_SHP, &nEntities, &nShapeType, NULL, NULL ); + for( i = 0; i < nEntities; i++ ) + { + int res ; + + psCShape = SHPReadObject( old_SHP, i ); + + if ( byRing == 1 ) { + int ring, prevStart, ringDir; + double ringArea; + + prevStart = psCShape->nVertices; + for ( ring = (psCShape->nParts - 1); ring >= 0; ring-- ) { + SHPObject *psO; + int j, numVtx, rStart; + + rStart = psCShape->panPartStart[ring]; + if ( ring == (psCShape->nParts -1) ) + { numVtx = psCShape->nVertices - rStart; } + else + { numVtx = psCShape->panPartStart[ring+1] - rStart; } + + printf ("(shpdata) Ring(%d) (%d for %d) \n", ring, rStart, numVtx); + psO = SHPClone ( psCShape, ring, ring + 1 ); + + ringDir = SHPRingDir_2d ( psO, 0 ); + ringArea = RingArea_2d (psO->nVertices,(double*) psO->padfX, + (double*) psO->padfY); + RingCentroid_2d ( psO->nVertices, (double*) psO->padfX, + (double*) psO->padfY, &ringCentrd, &ringArea); + + + printf ("(shpdata) Ring %d, %f Area %d dir \n", + ring, ringArea, ringDir ); + + SHPDestroyObject ( psO ); + printf ("(shpdata) End Ring \n"); + } /* (ring) [0,nParts */ + + } /* by ring */ + + oArea = SHPArea_2d ( psCShape ); + oLen = SHPLength_2d ( psCShape ); + oCentrd = SHPCentrd_2d ( psCShape ); + printf ("(shpdata) Part (%d) %f Area %f length, C (%f,%f)\n", + i, oArea, oLen, oCentrd.x, oCentrd.y ); + } + + SHPClose( old_SHP ); + + DBFClose( old_DBF ); + + printf ("\n"); +} diff --git a/support/ShapeLib/contrib/shpdxf.c b/support/ShapeLib/contrib/shpdxf.c new file mode 100644 index 00000000..c4e7cf24 --- /dev/null +++ b/support/ShapeLib/contrib/shpdxf.c @@ -0,0 +1,340 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * 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. + ****************************************************************************** + * + * shp2dxf.c + * + * derived from a ESRI Avenue Script + * and DXF specification from AutoCad 3 (yes 1984) + * + * modifications Carl Andrson 11/96 + * modifications Carl Andrson 3/97 + * + * converted to C code 12/98 + * + * requires shapelib 1.2 + * gcc shpdxf.c shpopen.o dbfopen.o -o shpdxf + * + */ + +#include +#include +#include "shapefil.h" + +#define FLOAT_PREC "%16.5f\r\n" + +void dxf_hdr (x1,y1,x2,y2,df) +double x1,y1,x2,y2; +FILE *df; +{ +/* Create HEADER section */ + + fprintf( df, " 0\r\n"); + fprintf( df, "SECTION\r\n"); + fprintf( df, " 2\r\n" ); + fprintf( df, "HEADER\r\n" ); + fprintf( df, " 9\r\n" ); + fprintf( df, "$EXTMAX\r\n" ); + fprintf( df, " 10\r\n" ); + fprintf( df, FLOAT_PREC, x2 ); + fprintf( df, " 20\r\n" ); + fprintf( df, FLOAT_PREC, y2 ); + fprintf( df, " 9\r\n" ); + fprintf( df, "$EXTMIN\r\n" ); + fprintf( df, " 10\r\n" ); + fprintf( df, FLOAT_PREC, x1 ); + fprintf( df, " 20\r\n" ); + fprintf( df, FLOAT_PREC, y1 ); + fprintf( df, " 9\r\n" ); + fprintf( df, "$LUPREC\r\n" ); + fprintf( df, " 70\r\n" ); + fprintf( df, " 14\r\n" ); + fprintf( df, " 0\r\n" ); + fprintf( df, "ENDSEC\r\n" ); + +/* ' Create TABLES section */ + + fprintf( df, " 0\r\n" ); + fprintf( df, "SECTION\r\n" ); + fprintf( df, " 2\r\n" ); + fprintf( df, "TABLES\r\n" ); +/* ' Table 1 - set up line type */ + fprintf( df, " 0\r\n" ); + fprintf( df, "TABLE\r\n" ); + fprintf( df, " 2\r\n" ); + fprintf( df, "LTYPE\r\n" ); + fprintf( df, " 70\r\n" ); + fprintf( df, "2\r\n" ); +/* ' Entry 1 of Table 1 */ + fprintf( df, " 0\r\n" ); + fprintf( df, "LTYPE\r\n" ); + fprintf( df, " 2\r\n" ); + fprintf( df, "CONTINUOUS\r\n" ); + fprintf( df, " 70\r\n" ); + fprintf( df, "64\r\n" ); + fprintf( df, " 3\r\n" ); + fprintf( df, "Solid line\r\n" ); + fprintf( df, " 72\r\n" ); + fprintf( df, "65\r\n" ); + fprintf( df, " 73\r\n" ); + fprintf( df, "0\r\n" ); + fprintf( df, " 40\r\n" ); + fprintf( df, "0.0\r\n" ); + fprintf( df, " 0\r\n" ); + fprintf( df, "ENDTAB\r\n" ); + /* End of TABLES section */ + fprintf( df, " 0\r\n" ); + fprintf( df, "ENDSEC\r\n" ); + + /* Create BLOCKS section */ + + fprintf( df, " 0\r\n" ); + fprintf( df, "SECTION\r\n" ); + fprintf( df, " 2\r\n" ); + fprintf( df, "BLOCKS\r\n" ); + fprintf( df, " 0\r\n" ); + fprintf( df, "ENDSEC\r\n" ); + fprintf( df, " 0\r\n" ); + fprintf( df, "SECTION\r\n" ); + fprintf( df, " 2\r\n" ); + fprintf( df, "ENTITIES\r\n" ); + +} + + +void +dxf_ent_preamble (dxf_type, id, df) +int dxf_type; +char *id; +FILE *df; +{ + + fprintf( df, " 0\r\n" ); + + switch (dxf_type) { + case SHPT_POLYGON: + case SHPT_ARC: fprintf (df, "POLYLINE\r\n"); + break; + default: fprintf(df, "POINT\r\n"); + } + + fprintf( df, " 8\r\n"); + fprintf( df, "%s\r\n", id ); + switch ( dxf_type ) { + case SHPT_ARC: + fprintf( df, " 6\r\n" ); + fprintf( df, "CONTINUOUS\r\n" ); + fprintf( df, " 66\r\n" ); + fprintf( df, "1\r\n" ); + break; + case SHPT_POLYGON: + fprintf( df, " 6\r\n" ); + fprintf( df, "CONTINUOUS\r\n" ); + fprintf( df, " 66\r\n" ); + fprintf( df, "1\r\n" ); + fprintf( df, " 70\r\n"); + fprintf (df, "1\r\n"); + default: break; + } + +} + +void +dxf_ent (id, x, y, z, dxf_type, df) +char *id; +double x,y,z; +int dxf_type; +FILE *df; +{ + if ((dxf_type == SHPT_ARC) || ( dxf_type == SHPT_POLYGON)) { + fprintf( df, " 0\r\n"); + fprintf( df, "VERTEX\r\n"); + fprintf( df, " 8\r\n"); + fprintf( df, "%s\r\n", id); + } + fprintf( df, " 10\r\n" ); + fprintf( df, FLOAT_PREC, x ); + fprintf( df, " 20\r\n" ); + fprintf( df, FLOAT_PREC, y ); + fprintf( df, " 30\r\n" ); + if ( z != 0 ) + fprintf( df, FLOAT_PREC, z ); + else + fprintf( df, "0.0\r\n" ); +} + + +void +dxf_ent_postamble (dxf_type, df) +int dxf_type; +FILE *df; +{ + if ((dxf_type == SHPT_ARC) || ( dxf_type == SHPT_POLYGON)) + fprintf( df, " 0\r\nSEQEND\r\n 8\r\n0\r\n"); +} + + +int +main (int argc, char **argv) + +{ + char shpFileName[80] = "", dbfFileName[80] = ""; + char dxfFileName[80] = ""; + char idfldName[15]; + char zfldName[6] = "ELEV"; + char fldName[15]; + char id[255]; + double elev; + int parts, *panParts, nParts, nVertices; + FILE *dxf; + SHPHandle shp; + DBFHandle dbf; + DBFFieldType idfld_type; + double adfBoundsMin[4], adfBoundsMax[4]; + int vrtx, shp_type, shp_numrec, zfld, idfld, nflds, recNum, part; + unsigned int MaxElem = -1; + + if ( argc < 2 ) { + printf ("usage: shpdxf shapefile {idfield}\r\n"); + exit (-1); + } + + strcpy (shpFileName,argv[1]); + strncpy (dbfFileName, shpFileName, strlen(shpFileName)-3); + strcat (dbfFileName,"dbf"); + + strncpy (dxfFileName, shpFileName,strlen(shpFileName)-3); + strcat( dxfFileName, "dxf"); + + shp = SHPOpen (shpFileName, "rb"); + dbf = DBFOpen (dbfFileName, "rb"); + dxf = fopen( dxfFileName, "w"); + + printf("Starting conversion %s(%s) -> %s\r\n", + shpFileName,dbfFileName,dxfFileName); + + SHPGetInfo (shp, &shp_numrec, &shp_type, adfBoundsMin, adfBoundsMax ); + printf ("file has %d objects\r\n", shp_numrec); + dxf_hdr(adfBoundsMin[0], adfBoundsMin[1], adfBoundsMax[0], adfBoundsMax[1], + dxf); + +/* Before proceeding, allow the user to specify the ID field to use or default to the record number.... */ + + if ( argc > 3 ) MaxElem = atoi(argv[3]); + + nflds = DBFGetFieldCount(dbf); + if ( argc > 2 ) { + strcpy (idfldName, argv[2]); + for ( idfld=0; idfld < nflds; idfld++ ) { + idfld_type = DBFGetFieldInfo( dbf, idfld, fldName, NULL, NULL); + if (!strcmp (idfldName, fldName )) + break; + } + if ( idfld >= nflds ) { + printf ("Id field %s not found, using default\r\n",idfldName); + idfld = -1; + } else + printf ("proceeding with field %s for LayerNames\r\n",fldName); + } + else + idfld = -1; + + for ( zfld=0; zfld < nflds; zfld++ ) { + DBFGetFieldInfo( dbf, zfld, fldName, NULL, NULL); + if (!strcmp (zfldName, fldName )) + break; + } + if ( zfld >= nflds ) + zfld = -1; +// printf ("proceeding with id = %d, elevation = %d\r\n",idfld, zfld); + +/* Proceed to process data..... */ + + for ( recNum = 0; (recNum < shp_numrec) && (recNum < MaxElem); recNum++) { + + SHPObject *shape; + + if ( idfld >= 0 ) + switch (idfld_type) { + case FTString: sprintf (id, "lvl_%s",DBFReadStringAttribute ( dbf, recNum, idfld )); + break; + default: sprintf(id, "%-20.0lf", DBFReadDoubleAttribute (dbf, recNum, idfld)); + } + else + sprintf (id,"lvl_%-20d",(recNum +1 )); + + + if ( zfld >= 0 ) + elev = 0; + else + elev = DBFReadDoubleAttribute ( dbf, recNum, zfld ); + +#ifdef DEBUG + printf("\r\nworking on obj %d", recNum); +#endif + + shape = SHPReadObject( shp, recNum ); + + nVertices = shape->nVertices; + nParts = shape->nParts; + panParts = shape->panPartStart; + part = 0; + for (vrtx=0; vrtx < nVertices; vrtx ++ ) { +#ifdef DEBUG + printf("\rworking on part %d, vertex %d", part,vrtx); +#endif + if ( panParts[part] == vrtx ) { +#ifdef DEBUG + printf ("object preamble\r\n"); +#endif + dxf_ent_preamble (shp_type, id, dxf); + } + + dxf_ent (id, shape->padfX[vrtx], shape->padfY[vrtx], + elev, shp_type, dxf); + + if ((panParts[part] == (vrtx + 1))|| (vrtx == (nVertices -1)) ) { + dxf_ent_postamble (shp_type, dxf); + part ++; + } + } + SHPDestroyObject( shape ); + } + +/* close out DXF file */ + fprintf( dxf, "0\r\n" ); + fprintf( dxf, "ENDSEC\r\n" ); + fprintf( dxf, "0\r\n" ); + fprintf( dxf, "EOF\r\n" ); + + + SHPClose (shp); + DBFClose (dbf); + fclose (dxf); +} + + + + + + diff --git a/support/ShapeLib/contrib/shpfix.c b/support/ShapeLib/contrib/shpfix.c new file mode 100644 index 00000000..1ed73a32 --- /dev/null +++ b/support/ShapeLib/contrib/shpfix.c @@ -0,0 +1,110 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * 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. + ****************************************************************************** + * shpfix + * + * + * gcc -c shpfix.c shpopen.c -o shpfix + * + * Utility program to fix nulls and inconsistencies in Shapefiles + * as happens from time to time + * + * Simply load and rewrite each record, parameter fixrex allow user to null + * a particularly nasty record if needed + * + */ + +#include +#include +#include "shapefil.h" + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP, cSHP; + int nShapeType, cShapeType, nEntities, i; + double adBounds[4]; + SHPObject *shape; + int fix_rec; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc <= 3 ) + { + printf( "shpfix shpfile new_file \n" ); + exit( 1 ); + } + + fix_rec = atoi (argv[3]); + fix_rec --; + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( argv[1], "rb+" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( hSHP, &nEntities, &nShapeType, NULL, NULL ); + + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + cSHP = SHPCreate( argv[2], nShapeType ); + + if( cSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[2] ); + exit( 1 ); + } + + SHPGetInfo( cSHP, NULL, &cShapeType, &(adBounds[0]), &(adBounds[2]) ); + + +/* -------------------------------------------------------------------- */ +/* Skim over the list of shapes, printing all the vertices. */ +/* -------------------------------------------------------------------- */ + + for( i = 0; i < nEntities; i++ ) + { + + shape = SHPReadObject( hSHP, i ); + if ( i == fix_rec ) + { shape->nParts = 0; + shape->nVertices = 0; + } + SHPWriteObject( cSHP, -1, shape ); + SHPDestroyObject ( shape ); + + } + + + SHPClose ( hSHP ); + SHPClose ( cSHP ); +} diff --git a/support/ShapeLib/contrib/shpgeo.c b/support/ShapeLib/contrib/shpgeo.c new file mode 100644 index 00000000..3b04b3a9 --- /dev/null +++ b/support/ShapeLib/contrib/shpgeo.c @@ -0,0 +1,1631 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * 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. + ****************************************************************************** + * + * requires shapelib 1.2 + * gcc shpproj shpopen.o dbfopen.o -lm -lproj -o shpproj + * + * this may require linking with the PROJ4 projection library available from + * + * http://www.remotesensing.org/proj + * + * use -DPROJ4 to compile in Projection support + * + * $Log: shpgeo.c,v $ + * Revision 1.16 2017-07-10 18:01:35 erouault + * * contrib/shpgeo.c: fix compilation on _MSC_VER < 1800 regarding lack + * of NAN macro. + * + * Revision 1.15 2016-12-06 21:13:33 erouault + * * configure.ac: change soname to 2:1:0 to be in sync with Debian soname. + * http://bugzilla.maptools.org/show_bug.cgi?id=2628 + * Patch by Bas Couwenberg + * + * * contrib/doc/Shape_PointInPoly_README.txt, contrib/shpgeo.c: typo fixes. + * http://bugzilla.maptools.org/show_bug.cgi?id=2629 + * Patch by Bas Couwenberg + * + * * web/*: use a local .css file to avoid a privacy breach issue reported + * by the lintian QA tool. + * http://bugzilla.maptools.org/show_bug.cgi?id=2630 + * Patch by Bas Couwenberg + * + * + * Contributed by Sandro Mani: https://github.com/manisandro/shapelib/tree/autotools + * + * Revision 1.14 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.13 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.12 2007-09-03 23:17:46 fwarmerdam + * fix SHPDimension() function + * + * Revision 1.11 2006/11/06 20:45:58 fwarmerdam + * Fixed SHPProject. + * + * Revision 1.10 2006/11/06 20:44:58 fwarmerdam + * SHPProject() uses pj_transform now + * + * Revision 1.9 2006/01/25 15:33:50 fwarmerdam + * fixed ppsC assignment maptools bug 1263 + * + * Revision 1.8 2002/01/15 14:36:56 warmerda + * upgrade to use proj_api.h + * + * Revision 1.7 2002/01/11 15:22:04 warmerda + * fix many warnings. Lots of this code is cruft. + * + * Revision 1.6 2001/08/30 13:42:31 warmerda + * avoid use of auto initialization of PT for VC++ + * + * Revision 1.5 2000/04/26 13:24:06 warmerda + * made projUV handling safer + * + * Revision 1.4 2000/04/26 13:17:15 warmerda + * check if projUV or UV + * + * Revision 1.3 2000/03/17 14:15:16 warmerda + * Don't try to use system nan.h ... doesn't always exist. + * + * Revision 1.2 1999/05/26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + */ + +#include +#include +#include +#include "shapefil.h" + +#include "shpgeo.h" + +#if defined(_MSC_VER) && _MSC_VER < 1800 +#include +#define INFINITY (DBL_MAX + DBL_MAX) +#define NAN (INFINITY - INFINITY) +#endif + + + /* I'm using some shorthand throughout this file + * R+ is a Clockwise Ring and is the positive portion of an object + * R- is a CounterClockwise Ring and is a hole in a R+ + * A complex object is one having at least one R- + * A compound object is one having more than one R+ + * A simple object has one and only one element (R+ or R-) + * + * The closed ring constraint is for polygons and assumed here + * Arcs or LineStrings I am calling Rings (generically open or closed) + * Point types are vertices or lists of vertices but not Rings + * + * SHPT_POLYGON, SHPT_POLYGONZ, SHPT_POLYGONM and SHPT_MULTIPATCH + * can have SHPObjects that are compound as well as complex + * + * SHP_POINT and its Z and M derivatives are strictly simple + * MULTI_POINT, SHPT_ARC and their derivatives may be simple or compound + * + */ + + +/* ************************************************************************** + * asFileName + * + * utility function, toss part of filename after last dot + * + * **************************************************************************/ +char * asFileName ( const char *fil, char *ext ) { + char pszBasename[120]; + static char pszFullname[120]; + int i; +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ +// pszFullname = (char*) malloc(( strlen(fil)+5 )); +// pszBasename = (char *) malloc(strlen(fil)+5); + strcpy( pszBasename, fil ); + for( i = strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + +/* -------------------------------------------------------------------- */ +/* Note that files pulled from */ +/* a PC to Unix with upper case filenames won't work! */ +/* -------------------------------------------------------------------- */ +// pszFullname = (char *) malloc(strlen(pszBasename) + 5); + sprintf( pszFullname, "%s.%s", pszBasename, ext ); + + return ( pszFullname ); +} + + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ +/* copied directly from shpopen.c -- maybe expose this in shapefil.h */ +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + + +/* ************************************************************************** + * SHPPRoject + * + * Project points using projection handles, for use with PROJ4.3 + * + * act as a wrapper to protect against library changes in PROJ + * + * **************************************************************************/ +int SHPProject ( SHPObject *psCShape, projPJ inproj, projPJ outproj ) { +#ifdef PROJ4 + + int j; + + if ( pj_is_latlong(inproj) ) { + for(j=0; j < psCShape->nVertices; j++) { + psCShape->padfX[j] *= DEG_TO_RAD; + psCShape->padfY[j] *= DEG_TO_RAD; + } + } + + pj_transform(inproj, outproj, psCShape->nVertices, 0, psCShape->padfX, + psCShape->padfY, NULL); + + if ( pj_is_latlong(outproj) ) { + for(j=0; j < psCShape->nVertices; j++) { + psCShape->padfX[j] *= RAD_TO_DEG; + psCShape->padfY[j] *= RAD_TO_DEG; + } + } + + /* Recompute new Extents of projected Object */ + SHPComputeExtents ( psCShape ); +#endif + + return ( 1 ); +} + + +/* ************************************************************************** + * SHPSetProjection + * + * establish a projection handle for use with PROJ4.3 + * + * act as a wrapper to protect against library changes in PROJ + * + * **************************************************************************/ +projPJ SHPSetProjection ( int param_cnt, char **params ) { +#ifdef PROJ4 + projPJ *p = NULL; + + if ( param_cnt > 0 && params[0] ) + { + p = pj_init ( param_cnt, params ); + } + else + { + char* params_local[] = { "+proj=longlat", NULL }; + p = pj_init ( 1, params_local ); + } + + return ( p ); +#else + return ( NULL ); +#endif +} + + +/* ************************************************************************** + * SHPFreeProjection + * + * release a projection handle for use with PROJ4.3 + * + * act as a wrapper to protect against library changes in PROJ + * + * **************************************************************************/ +int SHPFreeProjection ( projPJ p) { +#ifdef PROJ4 + if ( p ) + pj_free ( p ); +#endif + return ( 1 ); +} + + +/* ************************************************************************** + * SHPOGisType + * + * Convert Both ways from and to OGIS Geometry Types + * + * **************************************************************************/ +int SHPOGisType ( int GeomType, int toOGis) { + + if ( toOGis == 0 ) /* connect OGis -> SHP types */ + switch (GeomType) { + case (OGIST_POINT): return ( SHPT_POINT ); break; + case (OGIST_LINESTRING): return ( SHPT_ARC ); break; + case (OGIST_POLYGON): return ( SHPT_POLYGON ); break; + case (OGIST_MULTIPOINT): return ( SHPT_MULTIPOINT ); break; + case (OGIST_MULTILINE): return ( SHPT_ARC ); break; + case (OGIST_MULTIPOLYGON): return ( SHPT_POLYGON ); break; + } + else /* ok so its SHP->OGis types */ + switch (GeomType) { + case (SHPT_POINT): return ( OGIST_POINT ); break; + case (SHPT_POINTM): return ( OGIST_POINT ); break; + case (SHPT_POINTZ): return ( OGIST_POINT ); break; + case (SHPT_ARC): return ( OGIST_LINESTRING );break; + case (SHPT_ARCZ): return ( OGIST_LINESTRING );break; + case (SHPT_ARCM): return ( OGIST_LINESTRING );break; + case (SHPT_POLYGON): return ( OGIST_MULTIPOLYGON );break; + case (SHPT_POLYGONZ): return ( OGIST_MULTIPOLYGON );break; + case (SHPT_POLYGONM): return ( OGIST_MULTIPOLYGON );break; + case (SHPT_MULTIPOINT): return ( OGIST_MULTIPOINT );break; + case (SHPT_MULTIPOINTZ): return ( OGIST_MULTIPOINT );break; + case (SHPT_MULTIPOINTM): return ( OGIST_MULTIPOINT );break; + case (SHPT_MULTIPATCH): return ( OGIST_GEOMCOLL ); break; + } + + return 0; +} + + +/* ************************************************************************** + * SHPReadSHPStream + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPReadSHPStream ( SHPObject *psCShape, char *stream_obj) { + +int obj_storage; +int my_order, need_swap =0, GeoType ; +int use_Z = 0; +int use_M = 0; + + need_swap = stream_obj[0]; + my_order = 1; + my_order = ((char*) (&my_order))[0]; + need_swap = need_swap & my_order; + + if ( need_swap ) + swapW (stream_obj, (void*) &GeoType, sizeof (GeoType) ); + else + memcpy (stream_obj, &GeoType, sizeof (GeoType) ); + + + if ( need_swap ) { + + } else { + memcpy (stream_obj, &(psCShape->nSHPType), sizeof (psCShape->nSHPType) ); + memcpy (stream_obj, &(psCShape->nShapeId), sizeof (psCShape->nShapeId) ); + memcpy (stream_obj, &(psCShape->nVertices), sizeof (psCShape->nVertices) ); + memcpy (stream_obj, &(psCShape->nParts), sizeof (psCShape->nParts) ); + memcpy (stream_obj, &(psCShape->dfXMin), sizeof (psCShape->dfXMin) ); + memcpy (stream_obj, &(psCShape->dfYMin), sizeof (psCShape->dfYMin) ); + memcpy (stream_obj, &(psCShape->dfXMax), sizeof (psCShape->dfXMax) ); + memcpy (stream_obj, &(psCShape->dfYMax), sizeof (psCShape->dfYMax) ); + if ( use_Z ) { + memcpy (stream_obj, &(psCShape->dfZMin), sizeof (psCShape->dfZMin) ); + memcpy (stream_obj, &(psCShape->dfZMax), sizeof (psCShape->dfZMax) ); + } + + memcpy (stream_obj, psCShape->panPartStart, psCShape->nParts * sizeof (int) ); + memcpy (stream_obj, psCShape->panPartType, psCShape->nParts * sizeof (int) ); + +/* get X and Y coordinate arrarys */ + memcpy (stream_obj, psCShape->padfX, psCShape->nVertices * 2 * sizeof (double) ); + +/* get Z coordinate array if used */ + if ( use_Z ) + memcpy (stream_obj, psCShape->padfZ, psCShape->nVertices * 2 * sizeof (double) ); +/* get Measure coordinate array if used */ + if ( use_M ) + memcpy (stream_obj, psCShape->padfM, psCShape->nVertices * 2 * sizeof (double) ); + } /* end put data without swap */ + + return (0); +} + + +/* ************************************************************************** + * SHPWriteSHPStream + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPWriteSHPStream ( WKBStreamObj *stream_obj, SHPObject *psCShape ) { + +/*int obj_storage = 0;*/ +int need_swap = 0, my_order, GeoType; +int use_Z = 0; +int use_M = 0; + + need_swap = 1; + need_swap = ((char*) (&need_swap))[0]; + + /*realloc (stream_obj, obj_storage );*/ + + if ( need_swap ) { + + } else { + memcpy (stream_obj, psCShape, 4 * sizeof (int) ); + memcpy (stream_obj, psCShape, 4 * sizeof (double) ); + if ( use_Z ) + memcpy (stream_obj, psCShape, 2 * sizeof (double) ); + if ( use_M ) + memcpy (stream_obj, psCShape, 2 * sizeof (double) ); + + memcpy (stream_obj, psCShape, psCShape->nParts * 2 * sizeof (int) ); + memcpy (stream_obj, psCShape, psCShape->nVertices * 2 * sizeof (double) ); + if ( use_Z ) + memcpy (stream_obj, psCShape, psCShape->nVertices * 2 * sizeof (double) ); + if ( use_M ) + memcpy (stream_obj, psCShape, psCShape->nVertices * 2 * sizeof (double) ); + } + + return (0); +} + + +/* ************************************************************************** + * WKBStreamWrite + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int WKBStreamWrite ( WKBStreamObj* wso, void* this, int tcount, int tsize ) { + + if ( wso->NeedSwap ) + SwapG ( &(wso->wStream[wso->StreamPos]), this, tcount, tsize ); + else + memcpy ( &(wso->wStream[wso->StreamPos]), this, tsize * tcount ); + + wso->StreamPos += tsize; + + return 0; +} + + + +/* ************************************************************************** + * WKBStreamRead + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int WKBStreamRead ( WKBStreamObj* wso, void* this, int tcount, int tsize ) { + + if ( wso->NeedSwap ) + SwapG ( this, &(wso->wStream[wso->StreamPos]), tcount, tsize ); + else + memcpy ( this, &(wso->wStream[wso->StreamPos]), tsize * tcount ); + + wso->StreamPos += tsize; + + return 0; +} + + + +/* ************************************************************************** + * SHPReadOGisWKB + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +SHPObject* SHPReadOGisWKB ( WKBStreamObj *stream_obj) { + SHPObject *psCShape; + char WKB_order; + int need_swap = 0, my_order, GeoType = 0; + int use_Z = 0, use_M = 0; + int nSHPType, thisDim; + + WKBStreamRead ( stream_obj, &WKB_order, 1, sizeof(char)); + my_order = 1; + my_order = ((char*) (&my_order))[0]; + stream_obj->NeedSwap = !(WKB_order & my_order); + + /* convert OGis Types to SHP types */ + nSHPType = SHPOGisType ( GeoType, 0 ); + + WKBStreamRead ( stream_obj, &GeoType, 1, sizeof(int)); + + thisDim = SHPDimension ( nSHPType ); + + if ( thisDim && SHPD_AREA ) + { psCShape = SHPReadOGisPolygon ( stream_obj ); } + else { + if ( thisDim && SHPD_LINE ) + { psCShape = SHPReadOGisLine ( stream_obj ); } + else { + if ( thisDim && SHPD_POINT ) + { psCShape = SHPReadOGisPoint ( stream_obj ); } + } + } + + + return (0); +} + + + +/* ************************************************************************** + * SHPWriteOGisWKB + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPWriteOGisWKB ( WKBStreamObj* stream_obj, SHPObject *psCShape ) { + + int need_swap = 0, my_order, GeoType, thisDim; + int use_Z = 0, use_M = 0; + char LSB = 1; + /* indicate that this WKB is in LSB Order */ + + /* OGis WKB can handle either byte order, but if I get to choose I'd + /* rather have it predicatable system-to-system */ + + if ( stream_obj ) { + if ( stream_obj->wStream ) + free ( stream_obj->wStream ); + } else + { stream_obj = calloc ( 3, sizeof (int ) ); } + + /* object size needs to be 9 bytes for the wrapper, and for each polygon */ + /* another 9 bytes all plus twice the total number of vertices */ + /* times the sizeof (double) and just pad with 10 more chars for fun */ + stream_obj->wStream = calloc (1, (9 * (psCShape->nParts + 1)) + + ( sizeof(double) * 2 * psCShape->nVertices ) + 10 ); + + #ifdef DEBUG2 + printf (" I just allocated %d bytes to wkbObj \n", + (int)(sizeof (int) + sizeof (int) + sizeof(int) + + ( sizeof(int) * psCShape->nParts + 1 ) + + ( sizeof(double) * 2 * psCShape->nVertices ) + 10) ); + #endif + + my_order = 1; + my_order = ((char*) (&my_order))[0]; + /* Need to swap if this system is not LSB (Intel Order) */ + stream_obj->NeedSwap = ( my_order != LSB ); + + stream_obj->StreamPos = 0; + + + #ifdef DEBUG2 + printf ("this system is (%d) LSB recorded as needSwap %d\n",my_order, stream_obj->NeedSwap); + #endif + + WKBStreamWrite ( stream_obj, & LSB, 1, sizeof(char) ); + + #ifdef DEBUG2 + printf ("this system in LSB \n"); + #endif + + + /* convert SHP Types to OGis types */ + GeoType = SHPOGisType ( psCShape->nSHPType, 1 ); + WKBStreamWrite ( stream_obj, &GeoType, 1, sizeof(int) ); + + thisDim = SHPDimension ( psCShape->nSHPType ); + + if ( thisDim && SHPD_AREA ) + { SHPWriteOGisPolygon ( stream_obj, psCShape ); } + else { + if ( thisDim && SHPD_LINE ) + { SHPWriteOGisLine ( stream_obj, psCShape ); } + else { + if ( thisDim && SHPD_POINT ) + { SHPWriteOGisPoint ( stream_obj, psCShape ); } + } + } + +#ifdef DEBUG2 + printf("(SHPWriteOGisWKB) outta here when stream pos is %d \n", stream_obj->StreamPos); +#endif + return (0); +} + + +/* ************************************************************************** + * SHPWriteOGisPolygon + * + * for this pass code to more generic OGis MultiPolygon Type + * later add support for OGis Polygon Type + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPWriteOGisPolygon ( WKBStreamObj *stream_obj, SHPObject *psCShape ) { + SHPObject **ppsC; + SHPObject *psC; + int rPart, ring, rVertices, cpart, cParts, nextring, i, j; + char Flag = 1; + int GeoType = OGIST_POLYGON; + + /* cant have more than nParts complex objects in this object */ + ppsC = calloc ( psCShape->nParts, sizeof(int) ); + + + nextring = 0; + cParts=0; + while ( nextring >= 0 ) { + ppsC[cParts] = SHPUnCompound ( psCShape, &nextring ); + cParts++; + } + +#ifdef DEBUG2 + printf ("(SHPWriteOGisPolygon) Uncompounded into %d parts \n", cParts); +#endif + + WKBStreamWrite ( stream_obj, &cParts, 1, sizeof(int) ); + + for ( cpart = 0; cpart < cParts; cpart++) { + + WKBStreamWrite ( stream_obj, & Flag, 1, sizeof(char) ); + WKBStreamWrite ( stream_obj, & GeoType, 1, sizeof(int) ); + + psC = (SHPObject*) ppsC[cpart]; + WKBStreamWrite ( stream_obj, &(psC->nParts), 1, sizeof(int) ); + + for ( ring = 0; (ring < (psC->nParts)) && (psC->nParts > 0); ring ++) { + if ( ring < (psC->nParts-2) ) + { rVertices = psC->panPartStart[ring+1] - psC->panPartStart[ring]; } + else + { rVertices = psC->nVertices - psC->panPartStart[ring]; } +#ifdef DEBUG2 + printf ("(SHPWriteOGisPolygon) scanning part %d, ring %d %d vtxs \n", + cpart, ring, rVertices); +#endif + rPart = psC->panPartStart[ring]; + WKBStreamWrite ( stream_obj, &rVertices, 1, sizeof(int) ); + for ( j=rPart; j < (rPart + rVertices); j++ ) { + WKBStreamWrite ( stream_obj, &(psC->padfX[j]), 1, sizeof(double) ); + WKBStreamWrite ( stream_obj, &(psC->padfY[j]), 1, sizeof(double) ); + } /* for each vertex */ + } /* for each ring */ + } /* for each complex part */ + +#ifdef DEBUG2 + printf ("(SHPWriteOGisPolygon) outta here \n"); +#endif + return (1); +} + + +/* ************************************************************************** + * SHPWriteOGisLine + * + * for this pass code to more generic OGis MultiXXXXXXX Type + * later add support for OGis LineString Type + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPWriteOGisLine ( WKBStreamObj *stream_obj, SHPObject *psCShape ) { + + return ( SHPWriteOGisPolygon( stream_obj, psCShape )); +} + + +/* ************************************************************************** + * SHPWriteOGisPoint + * + * for this pass code to more generic OGis MultiPoint Type + * later add support for OGis Point Type + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPWriteOGisPoint ( WKBStreamObj *stream_obj, SHPObject *psCShape ) { + int j; + + WKBStreamWrite ( stream_obj, &(psCShape->nVertices), 1, sizeof(int) ); + + for ( j=0; j < psCShape->nVertices; j++ ) { + WKBStreamWrite ( stream_obj, &(psCShape->padfX[j]), 1, sizeof(double) ); + WKBStreamWrite ( stream_obj, &(psCShape->padfY[j]), 1, sizeof(double) ); + } /* for each vertex */ + + return (1); +} + + + +/* ************************************************************************** + * SHPReadOGisPolygon + * + * for this pass code to more generic OGis MultiPolygon Type + * later add support for OGis Polygon Type + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +SHPObject* SHPReadOGisPolygon ( WKBStreamObj *stream_obj ) { + SHPObject **ppsC; + SHPObject *psC; + int rPart, ring, rVertices, cpart, cParts, nextring, i, j; + int totParts, totVertices, pRings, nParts; + + psC = SHPCreateObject ( SHPT_POLYGON, -1, 0, NULL, NULL, 0, + NULL, NULL, NULL, NULL ); + /* initialize a blank SHPObject */ + + WKBStreamRead ( stream_obj, &cParts, 1, sizeof(char) ); + + totParts = cParts; + totVertices = 0; + + SfRealloc ( psC->panPartStart, cParts * sizeof(int)); + SfRealloc ( psC->panPartType, cParts * sizeof(int)); + + for ( cpart = 0; cpart < cParts; cpart++) { + WKBStreamRead ( stream_obj, &nParts, 1, sizeof(int) ); + pRings = nParts; + /* pRings is the number of rings prior to the Ring loop below */ + + if ( nParts > 1 ) { + totParts += nParts - 1; + SfRealloc ( psC->panPartStart, totParts * sizeof(int)); + SfRealloc ( psC->panPartType, totParts * sizeof(int)); + } + + rPart = 0; + for ( ring = 0; ring < (nParts - 1); ring ++) { + WKBStreamRead ( stream_obj, &rVertices, 1, sizeof(int) ); + totVertices += rVertices; + + psC->panPartStart[ring+pRings] = rPart; + if ( ring == 0 ) + { psC->panPartType[ring + pRings] = SHPP_OUTERRING; } + else + { psC->panPartType[ring + pRings] = SHPP_INNERRING; } + + SfRealloc ( psC->padfX, totVertices * sizeof (double)); + SfRealloc ( psC->padfY, totVertices * sizeof (double)); + + for ( j=rPart; j < (rPart + rVertices); j++ ) { + WKBStreamRead ( stream_obj, &(psC->padfX[j]), 1, sizeof(double) ); + WKBStreamRead ( stream_obj, &(psC->padfY[j]), 1, sizeof(double) ); + } /* for each vertex */ + rPart += rVertices; + + } /* for each ring */ + + } /* for each complex part */ + + return ( psC ); + +} + + +/* ************************************************************************** + * SHPReadOGisLine + * + * for this pass code to more generic OGis MultiLineString Type + * later add support for OGis LineString Type + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +SHPObject* SHPReadOGisLine ( WKBStreamObj *stream_obj ) { + SHPObject **ppsC; + SHPObject *psC; + int rPart, ring, rVertices, cpart, cParts, nextring, i, j; + int totParts, totVertices, pRings, nParts; + + psC = SHPCreateObject ( SHPT_ARC, -1, 0, NULL, NULL, 0, + NULL, NULL, NULL, NULL ); + /* initialize a blank SHPObject */ + + WKBStreamRead ( stream_obj, &cParts, 1, sizeof(int) ); + + totParts = cParts; + totVertices = 0; + + SfRealloc ( psC->panPartStart, cParts * sizeof(int)); + SfRealloc ( psC->panPartType, cParts * sizeof(int)); + + for ( cpart = 0; cpart < cParts; cpart++) { + WKBStreamRead ( stream_obj, &nParts, 1, sizeof(int) ); + pRings = totParts; + /* pRings is the number of rings prior to the Ring loop below */ + + if ( nParts > 1 ) { + totParts += nParts - 1; + SfRealloc ( psC->panPartStart, totParts * sizeof(int)); + SfRealloc ( psC->panPartType, totParts * sizeof(int)); + } + + rPart = 0; + for ( ring = 0; ring < (nParts - 1); ring ++) { + WKBStreamRead ( stream_obj, &rVertices, 1, sizeof(int) ); + totVertices += rVertices; + + psC->panPartStart[ring+pRings] = rPart; + if ( ring == 0 ) + { psC->panPartType[ring + pRings] = SHPP_OUTERRING; } + else + { psC->panPartType[ring + pRings] = SHPP_INNERRING; } + + SfRealloc ( psC->padfX, totVertices * sizeof (double)); + SfRealloc ( psC->padfY, totVertices * sizeof (double)); + + for ( j=rPart; j < (rPart + rVertices); j++ ) { + WKBStreamRead ( stream_obj, &(psC->padfX[j]), 1, sizeof(double) ); + WKBStreamRead ( stream_obj, &(psC->padfY[j]), 1, sizeof(double) ); + } /* for each vertex */ + rPart += rVertices; + + } /* for each ring */ + + } /* for each complex part */ + + return ( psC ); +} + + +/* ************************************************************************** + * SHPReadOGisPoint + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +SHPObject* SHPReadOGisPoint ( WKBStreamObj *stream_obj ) { + SHPObject *psC; + int nVertices, j; + + psC = SHPCreateObject ( SHPT_MULTIPOINT, -1, 0, NULL, NULL, 0, + NULL, NULL, NULL, NULL ); + /* initialize a blank SHPObject */ + + WKBStreamRead ( stream_obj, &nVertices, 1, sizeof(int) ); + + SfRealloc ( psC->padfX, nVertices * sizeof (double)); + SfRealloc ( psC->padfY, nVertices * sizeof (double)); + + for ( j=0; j < nVertices; j++ ) { + WKBStreamRead ( stream_obj, &(psC->padfX[j]), 1, sizeof(double) ); + WKBStreamRead ( stream_obj, &(psC->padfY[j]), 1, sizeof(double) ); + } /* for each vertex */ + + return ( psC ); +} + + + + +/* ************************************************************************** + * RingReadOGisWKB + * + * this accepts OGisLineStrings which are basic building blocks + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int RingReadOgisWKB ( SHPObject *psCShape, char *stream_obj) { + return 0; +} + + +/* ************************************************************************** + * RingWriteOGisWKB + * + * this emits OGisLineStrings which are basic building blocks + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int RingWriteOgisWKB ( SHPObject *psCShape, char *stream_obj) { + + return 0; +} + + +/* ************************************************************************** + * SHPDimension + * + * Return the Dimensionality of the SHPObject + * a handy utility function + * + * **************************************************************************/ +int SHPDimension ( int SHPType ) { + int dimension; + + dimension = 0; + + switch ( SHPType ) { + case SHPT_POINT : dimension = SHPD_POINT; break; + case SHPT_ARC : dimension = SHPD_LINE; break; + case SHPT_POLYGON : dimension = SHPD_AREA; break; + case SHPT_MULTIPOINT : dimension = SHPD_POINT; break; + case SHPT_POINTZ : dimension = SHPD_POINT | SHPD_Z; break; + case SHPT_ARCZ : dimension = SHPD_LINE | SHPD_Z; break; + case SHPT_POLYGONZ : dimension = SHPD_AREA | SHPD_Z; break; + case SHPT_MULTIPOINTZ : dimension = SHPD_POINT | SHPD_Z; break; + case SHPT_POINTM : dimension = SHPD_POINT | SHPD_MEASURE; break; + case SHPT_ARCM : dimension = SHPD_LINE | SHPD_MEASURE; break; + case SHPT_POLYGONM : dimension = SHPD_AREA | SHPD_MEASURE; break; + case SHPT_MULTIPOINTM : dimension = SHPD_POINT | SHPD_MEASURE; break; + case SHPT_MULTIPATCH : dimension = SHPD_AREA; break; + } + + return ( dimension ); +} + + +/* ************************************************************************** + * SHPPointinPoly_2d + * + * Return a Point inside an R+ of a potentially + * complex/compound SHPObject suitable for labelling + * return only one point even if if is a compound object + * + * reject non area SHP Types + * + * **************************************************************************/ +PT SHPPointinPoly_2d ( SHPObject *psCShape ) { + PT *sPT, rPT; + + if ( !(SHPDimension (psCShape->nSHPType) & SHPD_AREA) ) + { + rPT.x = NAN; + rPT.y = NAN; + return rPT; + } + + sPT = SHPPointsinPoly_2d ( psCShape ); + + if ( sPT ) { + rPT.x = sPT[0].x; + rPT.y = sPT[0].y; + } else { + rPT.x = NAN; + rPT.y = NAN; + } + return ( rPT ); +} + + +/* ************************************************************************** + * SHPPointsinPoly_2d + * + * Return a Point inside each R+ of a potentially + * complex/compound SHPObject suitable for labelling + * return one point for each R+ even if it is a compound object + * + * reject non area SHP Types + * + * **************************************************************************/ +PT* SHPPointsinPoly_2d ( SHPObject *psCShape ) { + PT *PIP = NULL; + int cRing; + SHPObject *psO, *psInt, *CLine; + double *CLx, *CLy; + int *CLstt, *CLst, nPIP, ring, rMpart, ring_vtx, ring_nVertices; + double rLen, rLenMax; + + if ( !(SHPDimension (psCShape->nSHPType) & SHPD_AREA) ) + return ( NULL ); + + while ( psO = SHPUnCompound (psCShape, &cRing)) { + CLx = calloc ( 4, sizeof(double)); + CLy = calloc ( 4, sizeof(double)); + CLst = calloc ( 2, sizeof(int)); + CLstt = calloc ( 2, sizeof(int)); + + /* a horizontal & vertical compound line though the middle of the */ + /* extents */ + CLx [0] = psO->dfXMin; + CLy [0] = (psO->dfYMin + psO->dfYMax ) * 0.5; + CLx [1] = psO->dfXMax; + CLy [1] = (psO->dfYMin + psO->dfYMax ) * 0.5; + + CLx [2] = (psO->dfXMin + psO->dfXMax ) * 0.5; + CLy [2] = psO->dfYMin; + CLx [3] = (psO->dfXMin + psO->dfXMax ) * 0.5; + CLy [3] = psO->dfYMax; + + CLst[0] = 0; CLst[1] = 2; + CLstt[0] = SHPP_RING; CLstt[1] = SHPP_RING; + + CLine = SHPCreateObject ( SHPT_POINT, -1, 2, CLst, CLstt, 4, + CLx, CLy, NULL, NULL ); + + /* with the H & V centrline compound object, intersect it with the OBJ */ + psInt = SHPIntersect_2d ( CLine, psO ); + /* return SHP type is lowest common dimensionality of the input types */ + + + /* find the longest linestring returned by the intersection */ + ring_vtx = psInt->nVertices ; + for ( ring = (psInt->nParts - 1); ring >= 0; ring-- ) { + ring_nVertices = ring_vtx - psInt->panPartStart[ring]; + + rLen += RingLength_2d ( ring_nVertices, + (double*) &(psInt->padfX [psInt->panPartStart[ring]]), + (double*) &(psInt->padfY [psInt->panPartStart[ring]]) ); + + if ( rLen > rLenMax ) + { rLenMax = rLen; + rMpart = psInt->panPartStart[ring]; + } + ring_vtx = psInt->panPartStart[ring]; + } + + /* add the centerpoint of the longest ARC of the intersection to the */ + /* PIP list */ + nPIP ++; + SfRealloc ( PIP, sizeof(double) * 2 * nPIP); + PIP[nPIP].x = (psInt ->padfX [rMpart] + psInt ->padfX [rMpart]) * 0.5; + PIP[nPIP].y = (psInt ->padfY [rMpart] + psInt ->padfY [rMpart]) * 0.5; + + SHPDestroyObject ( psO ); + SHPDestroyObject ( CLine ); + + /* does SHPCreateobject use preallocated memory or does it copy the */ + /* contents. To be safe conditionally release CLx, CLy, CLst, CLstt */ + if ( CLx ) free ( CLx ); + if ( CLy ) free ( CLy ); + if ( CLst ) free ( CLst ); + if ( CLstt ) free ( CLstt ); + } + + return ( PIP ); +} + + +/* ************************************************************************** + * SHPCentrd_2d + * + * Return the single mathematical / geometric centroid of a potentially + * complex/compound SHPObject + * + * reject non area SHP Types + * + * **************************************************************************/ +PT SHPCentrd_2d ( SHPObject *psCShape ) { + int ring, ringPrev, ring_nVertices, rStart; + double Area, ringArea; + PT ringCentrd, C; + + + if ( !(SHPDimension (psCShape->nSHPType) & SHPD_AREA) ) + { + C.x = NAN; + C.y = NAN; + return C; + } + +#ifdef DEBUG + printf ("for Object with %d vtx, %d parts [ %d, %d] \n", + psCShape->nVertices, psCShape->nParts, + psCShape->panPartStart[0],psCShape->panPartStart[1]); +#endif + + Area = 0; + C.x = 0.0; + C.y = 0.0; + + /* for each ring in compound / complex object calc the ring cntrd */ + + ringPrev = psCShape->nVertices; + for ( ring = (psCShape->nParts - 1); ring >= 0; ring-- ) { + rStart = psCShape->panPartStart[ring]; + ring_nVertices = ringPrev - rStart; + + RingCentroid_2d ( ring_nVertices, (double*) &(psCShape->padfX [rStart]), + (double*) &(psCShape->padfY [rStart]), &ringCentrd, &ringArea); + +#ifdef DEBUG + printf ("(SHPCentrd_2d) Ring %d, vtxs %d, area: %f, ring centrd %f, %f \n", + ring, ring_nVertices, ringArea, ringCentrd.x, ringCentrd.y); +#endif + + /* use Superposition of these rings to build a composite Centroid */ + /* sum the ring centrds * ringAreas, at the end divide by total area */ + C.x += ringCentrd.x * ringArea; + C.y += ringCentrd.y * ringArea; + Area += ringArea; + ringPrev = rStart; + } + + /* hold on the division by AREA until were at the end */ + C.x = C.x / Area; + C.y = C.y / Area; +#ifdef DEBUG + printf ("SHPCentrd_2d) Overall Area: %f, Centrd %f, %f \n", + Area, C.x, C.y); +#endif + return ( C ); +} + + +/* ************************************************************************** + * RingCentroid_2d + * + * Return the mathematical / geometric centroid of a single closed ring + * + * **************************************************************************/ +int RingCentroid_2d ( int nVertices, double *a, double *b, PT *C, double *Area ) { + int iv,jv; + int sign_x, sign_y; + double dy_Area, dx_Area, Cx_accum, Cy_accum, ppx, ppy; + double x_base, y_base, x, y; + +/* the centroid of a closed Ring is defined as + * + * Cx = sum (cx * dArea ) / Total Area + * and + * Cy = sum (cy * dArea ) / Total Area + */ + + x_base = a[0]; + y_base = b[0]; + + Cy_accum = 0.0; + Cx_accum = 0.0; + + ppx = a[1] - x_base; + ppy = b[1] - y_base; + *Area = 0; + +/* Skip the closing vector */ + for ( iv = 2; iv <= nVertices - 2; iv++ ) { + x = a[iv] - x_base; + y = b[iv] - y_base; + + /* calc the area and centroid of triangle built out of an arbitrary */ + /* base_point on the ring and each successive pair on the ring */ + + /* Area of a triangle is the cross product of its defining vectors */ + /* Centroid of a triangle is the average of its vertices */ + + dx_Area = ((x * ppy) - (y * ppx)) * 0.5; + *Area += dx_Area; + + Cx_accum += ( ppx + x ) * dx_Area; + Cy_accum += ( ppy + y ) * dx_Area; +#ifdef DEBUG2 + printf("(ringcentrd_2d) Pp( %f, %f), P(%f, %f)\n", ppx, ppy, x, y); + printf("(ringcentrd_2d) dA: %f, sA: %f, Cx: %f, Cy: %f \n", + dx_Area, *Area, Cx_accum, Cy_accum); +#endif + ppx = x; + ppy = y; + } + +#ifdef DEBUG2 + printf("(ringcentrd_2d) Cx: %f, Cy: %f \n", + ( Cx_accum / ( *Area * 3) ), ( Cy_accum / (*Area * 3) )); +#endif + + /* adjust back to world coords */ + C->x = ( Cx_accum / ( *Area * 3)) + x_base; + C->y = ( Cy_accum / ( *Area * 3)) + y_base; + + return ( 1 ); +} + + + + +/* ************************************************************************** + * SHPRingDir_2d + * + * Test Polygon for CW / CCW ( R+ / R- ) + * + * return 1 for R+ + * return -1 for R- + * return 0 for error + * **************************************************************************/ +int SHPRingDir_2d ( SHPObject *psCShape, int Ring ) { + int i, ti, last_vtx; + double tX; + double *a, *b; + double dx0, dx1, dy0, dy1, v1, v2 ,v3; + + tX = 0.0; + a = psCShape->padfX; + b = psCShape->padfY; + + if ( Ring >= psCShape->nParts ) return ( 0 ); + + if ( Ring >= psCShape->nParts -1 ) + { last_vtx = psCShape->nVertices; } + else + { last_vtx = psCShape->panPartStart[Ring + 1]; } + + /* All vertices at the corners of the extrema (rightmost lowest, leftmost lowest, */ + /* topmost rightest, ...) must be less than pi wide. If they werent they couldnt be */ + /* extrema. */ + /* of course the following will fail if the Extents are even a little wrong */ + + for ( i = psCShape->panPartStart[Ring]; i < last_vtx; i++ ) { + if ( b[i] == psCShape->dfYMax && a[i] > tX ) + { ti = i; } + } + +#ifdef DEBUG2 + printf ("(shpgeo:SHPRingDir) highest Rightmost Pt is vtx %d (%f, %f)\n", ti, a[ti], b[ti]); +#endif + + /* cross product */ + /* the sign of the cross product of two vectors indicates the right or left half-plane */ + /* which we can use to indicate Ring Dir */ + if ( ti > psCShape->panPartStart[Ring] & ti < last_vtx ) + { dx0 = a[ti-1] - a[ti]; + dx1 = a[ti+1] - a[ti]; + dy0 = b[ti-1] - b[ti]; + dy1 = b[ti+1] - b[ti]; + } + else + /* if the tested vertex is at the origin then continue from 0 */ + { dx1 = a[1] - a[0]; + dx0 = a[last_vtx] - a[0]; + dy1 = b[1] - b[0]; + dy0 = b[last_vtx] - b[0]; + } + +// v1 = ( (dy0 * 0) - (0 * dy1) ); +// v2 = ( (0 * dx1) - (dx0 * 0) ); +/* these above are always zero so why do the math */ + v3 = ( (dx0 * dy1) - (dx1 * dy0) ); + +#ifdef DEBUG2 + printf ("(shpgeo:SHPRingDir) cross product for vtx %d was %f \n", ti, v3); +#endif + + if ( v3 > 0 ) + { return (1); } + else + { return (-1); } +} + + + +/* ************************************************************************** + * SHPArea_2d + * + * Calculate the XY Area of Polygon ( can be compound / complex ) + * + * **************************************************************************/ +double SHPArea_2d ( SHPObject *psCShape ) { + double cArea; + int ring, ring_vtx, ringDir, ring_nVertices; + + cArea = 0; + if ( !(SHPDimension (psCShape->nSHPType) & SHPD_AREA) ) + return ( -1 ); + + + /* Walk each ring adding its signed Area, R- will return a negative */ + /* area, so we don't have to test for them */ + + /* I just start at the last ring and work down to the first */ + ring_vtx = psCShape->nVertices ; + for ( ring = (psCShape->nParts - 1); ring >= 0; ring-- ) { + ring_nVertices = ring_vtx - psCShape->panPartStart[ring]; + +#ifdef DEBUG2 + printf("(shpgeo:SHPArea_2d) part %d, vtx %d \n", ring, ring_nVertices); +#endif + cArea += RingArea_2d ( ring_nVertices, + (double*) &(psCShape->padfX [psCShape->panPartStart[ring]]), + (double*) &(psCShape->padfY [psCShape->panPartStart[ring]]) ); + + ring_vtx = psCShape->panPartStart[ring]; + } + +#ifdef DEBUG2 + printf ("(shpgeo:SHPArea_2d) Area = %f \n", cArea); +#endif + + /* Area is signed, negative Areas are R- */ + return ( cArea ); + +} + + +/* ************************************************************************** + * SHPLength_2d + * + * Calculate the Planar ( XY ) Length of Polygon ( can be compound / complex ) + * or Polyline ( can be compound ). Length on Polygon is its Perimeter + * + * **************************************************************************/ +double SHPLength_2d ( SHPObject *psCShape ) { + double Length; + int i, j; + double dx, dy; + + if ( !(SHPDimension (psCShape->nSHPType) & (SHPD_AREA || SHPD_LINE)) ) + return ( (double) -1 ); + + Length = 0; + j = 1; + for ( i = 1; i < psCShape->nVertices; i++ ) { + if ( psCShape->panPartStart[j] == i ) + { j ++; } + /* skip the moves with "pen up" from ring to ring */ + else + { + dx = psCShape->padfX[i] - psCShape->padfX[i-1]; + dy = psCShape->padfY[i] - psCShape->padfY[i-1]; + Length += sqrt ( ( dx * dx ) + ( dy * dy ) ); + } + /* simplify this equation */ + } + + return ( Length ); +} + + +/* ************************************************************************** + * RingLength_2d + * + * Calculate the Planar ( XY ) Length of Polygon ( can be compound / complex ) + * or Polyline ( can be compound ). Length of Polygon is its Perimeter + * + * **************************************************************************/ +double RingLength_2d ( int nVertices, double *a, double *b ) { + double Length; + int i, j; + double dx, dy; + + Length = 0; + j = 1; + for ( i = 1; i < nVertices; i++ ) { + dx = a[i] - b[i-1]; + dy = b[i] - b[i-1]; + Length += sqrt ( ( dx * dx ) + ( dy * dy ) ); + /* simplify this equation */ + } + + return ( Length ); +} + + +/* ************************************************************************** + * RingArea_2d + * + * Calculate the Planar Area of a single closed ring + * + * **************************************************************************/ +double RingArea_2d ( int nVertices, double *a, double *b ) { + int iv,jv; + double ppx, ppy; + static double Area; + double dx_Area; + double x_base, y_base, x, y; + + x_base = a[0]; + y_base = b[0]; + + ppx = a[1] - x_base; + ppy = b[1] - y_base; + Area = 0.0; +#ifdef DEBUG2 + printf("(shpgeo:RingArea) %d vertices \n", nVertices); +#endif + for ( iv = 2; iv <= ( nVertices - 1 ); iv++ ) { + x = a[iv] - x_base; + y = b[iv] - y_base; + + /* Area of a triangle is the cross product of its defining vectors */ + + dx_Area = ((x * ppy) - (y * ppx)) * 0.5; + + Area += dx_Area; +#ifdef DEBUG2 + printf ("(shpgeo:RingArea) dxArea %f sArea %f for pt(%f, %f)\n", + dx_Area, Area, x, y); +#endif + + ppx = x; + ppy = y; + } + +#ifdef DEBUG2 + printf ("(shpgeo:RingArea) total RingArea %f \n", Area); +#endif + return ( Area ); + +} + + + +/* ************************************************************************** + * SHPUnCompound + * + * ESRI calls this function explode + * Return a non compound ( possibly complex ) object + * + * ring_number is R+ number corresponding to object + * + * + * ignore complexity in Z dimension for now + * + * **************************************************************************/ +SHPObject* SHPUnCompound ( SHPObject *psCShape, int * ringNumber ) { + int ringDir, ring, lRing; + + if ( (*ringNumber >= psCShape->nParts) || *ringNumber == -1 ) { + *ringNumber = -1; + return (NULL); + } + + + if ( *ringNumber == (psCShape->nParts - 1) ) { + *ringNumber = -1; + return ( SHPClone(psCShape, (psCShape->nParts - 1), -1) ); + } + + lRing = *ringNumber; + ringDir = -1; + for ( ring = (lRing + 1); (ring < psCShape->nParts) && ( ringDir < 0 ); ring ++) + ringDir = SHPRingDir_2d ( psCShape, ring); + + if ( ring == psCShape->nParts ) + *ringNumber = -1; + else + *ringNumber = ring; +/* I am strictly assuming that all R- parts of a complex object + * directly follow their R+, so when we hit a new R+ its a + * new part of a compound object + * a SHPClean may be needed to enforce this as it is not part + * of ESRI's definition of a SHPfile + */ + +#ifdef DEBUG2 + printf ("(SHPUnCompound) asked for ring %d, lastring is %d \n", lRing, ring); +#endif + return ( SHPClone(psCShape, lRing, ring ) ); + +} + + +/* ************************************************************************** + * SHPIntersect_2d + * + * + * prototype only for now + * + * return object with lowest common dimensionality of objects + * + * **************************************************************************/ +SHPObject* SHPIntersect_2d ( SHPObject* a, SHPObject* b ) { + SHPObject *C; + + if ( (SHPDimension(a->nSHPType) && SHPD_POINT) || ( SHPDimension(b->nSHPType) && SHPD_POINT ) ) + return ( NULL ); + /* there is no intersect function like this for points */ + + C = SHPClone ( a, 0 , -1 ); + + return ( C); + +} + + + +/* ************************************************************************** + * SHPClean + * + * Test and fix normalization problems in shapes + * Different tests need to be implemented for different SHPTypes + * SHPT_POLYGON check ring directions CW / CCW ( R+ / R- ) + * put all R- after the R+ they are members of + * i.e. each complex object is completed before the + * next object is started + * check for closed rings + * ring must not intersect itself, even on edge + * + * no other types implemented yet + * + * not sure why but return object in place + * use for object casting and object verification + * **************************************************************************/ +int SHPClean ( SHPObject *psCShape ) { + + + return (0); +} + + +/* ************************************************************************** + * SHPClone + * + * Clone a SHPObject, replicating all data + * + * **************************************************************************/ +SHPObject* SHPClone ( SHPObject *psCShape, int lowPart, int highPart ) { + SHPObject *psObject; + int newParts, newVertices; +#ifdef DEBUG + int i; +#endif + + if ( highPart >= psCShape->nParts || highPart == -1 ) + highPart = psCShape->nParts ; + +#ifdef DEBUG + printf (" cloning SHP (%d parts) from ring %d to ring %d \n", + psCShape->nParts, lowPart, highPart); +#endif + + newParts = highPart - lowPart; + if ( newParts == 0 ) { return ( NULL ); } + + psObject = (SHPObject *) calloc(1,sizeof(SHPObject)); + psObject->nSHPType = psCShape->nSHPType; + psObject->nShapeId = psCShape->nShapeId; + + psObject->nParts = newParts; + if ( psCShape->padfX ) { + psObject->panPartStart = (int*) calloc (newParts, sizeof (int)); + memcpy ( psObject->panPartStart, psCShape->panPartStart, + newParts * sizeof (int) ); + } + if ( psCShape->padfX ) { + psObject->panPartType = (int*) calloc (newParts, sizeof (int)); + memcpy ( psObject->panPartType, + (int *) &(psCShape->panPartType[lowPart]), + newParts * sizeof (int) ); + } + + if ( highPart != psCShape->nParts ) { + newVertices = psCShape->panPartStart[highPart] - + psCShape->panPartStart[lowPart]; + } + else + { newVertices = psCShape->nVertices - psCShape->panPartStart[lowPart]; } + + +#ifdef DEBUG + if ( highPart = psCShape->nParts ) + i = psCShape->nVertices; + else + i = psCShape->panPartStart[highPart]; + printf (" from part %d (%d) to %d (%d) is %d vertices \n", + lowPart, psCShape->panPartStart[lowPart], highPart, + i, newVertices); +#endif + psObject->nVertices = newVertices; + if ( psCShape->padfX ) { + psObject->padfX = (double*) calloc (newVertices, sizeof (double)); + memcpy ( psObject->padfX, + (double *) &(psCShape->padfX[psCShape->panPartStart[lowPart]]), + newVertices * sizeof (double) ); + } + if ( psCShape->padfY ) { + psObject->padfY = (double*) calloc (newVertices, sizeof (double)); + memcpy ( psObject->padfY, + (double *) &(psCShape->padfY[psCShape->panPartStart[lowPart]]), + newVertices * sizeof (double) ); + } + if ( psCShape->padfZ ) { + psObject->padfZ = (double*) calloc (newVertices, sizeof (double)); + memcpy ( psObject->padfZ, + (double *) &(psCShape->padfZ[psCShape->panPartStart[lowPart]]), + newVertices * sizeof (double) ); + } + if ( psCShape->padfM ) { + psObject->padfM = (double*) calloc (newVertices, sizeof (double)); + memcpy ( psObject->padfM, + (double *) &(psCShape->padfM[psCShape->panPartStart[lowPart]]), + newVertices * sizeof (double) ); + } + + psObject->dfXMin = psCShape->dfXMin; + psObject->dfYMin = psCShape->dfYMin; + psObject->dfZMin = psCShape->dfZMin; + psObject->dfMMin = psCShape->dfMMin; + + psObject->dfXMax = psCShape->dfXMax; + psObject->dfYMax = psCShape->dfYMax; + psObject->dfZMax = psCShape->dfZMax; + psObject->dfMMax = psCShape->dfMMax; + + SHPComputeExtents ( psObject ); + return ( psObject ); +} + + + +/************************************************************************/ +/* SwapG */ +/* */ +/* Swap a 2, 4 or 8 byte word. */ +/************************************************************************/ +void SwapG( void *so, void *in, int this_cnt, int this_size ) { + int i, j; + unsigned char temp; + +/* return to a new pointer otherwise it would invalidate existing data */ +/* as prevent further use of it */ + + for( j=0; j < this_cnt; j++ ) + { + for( i=0; i < this_size/2; i++ ) + { + ((unsigned char *) so)[i] = ((unsigned char *) in)[this_size-i-1]; + ((unsigned char *) so)[this_size-i-1] = ((unsigned char *) in)[i]; + } + } +} + + +/* ************************************************************************** + * SwapW + * + * change byte order on an array of 16 bit words + * need to change this over to shapelib, Frank Warmerdam's functions + * + * **************************************************************************/ +void swapW (void *so, unsigned char *in, long bytes) { + int i, j; + unsigned char map[4] = {3,2,1,0}; + unsigned char *out; + + out = so; + for (i=0; i <= (bytes/4); i++) + for (j=0; j < 4; j++) + out[(i*4)+map[j]] = in[(i*4)+j]; +} + + +/* ************************************************************************** + * SwapD + * + * change byte order on an array of (double) 32 bit words + * need to change this over to shapelib, Frank Warmerdam's functons + * + * **************************************************************************/ +void swapD (void *so, unsigned char *in, long bytes) { + int i, j; + unsigned char map[8] = {7,6,5,4,3,2,1,0}; + unsigned char *out; + + out = so; + for (i=0; i <= (bytes/8); i++) + for (j=0; j < 8; j++) + out[(i*8)+map[j]] = in[(i*8)+j]; +} + diff --git a/support/ShapeLib/contrib/shpgeo.h b/support/ShapeLib/contrib/shpgeo.h new file mode 100644 index 00000000..930df6ed --- /dev/null +++ b/support/ShapeLib/contrib/shpgeo.h @@ -0,0 +1,162 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * 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. + ****************************************************************************** + * shpgeo.h + * + * support for geometric and other additions to shapelib + * + * + * $Log: shpgeo.h,v $ + * Revision 1.4 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.3 2002-01-15 14:36:56 warmerda + * upgrade to use proj_api.h + * + * Revision 1.2 1999/05/26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * + */ + + + + /* I'm using some shorthand throughout this file + * R+ is a Clockwise Ring and is the positive portion of an object + * R- is a CounterClockwise Ring and is a hole in a R+ + * A complex object is one having at least one R- + * A compound object is one having more than one R+ + * A simple object has one and only one element (R+ or R-) + * + * The closed ring constraint is for polygons and assumed here + * Arcs or LineStrings I am calling Rings (generically open or closed) + * Point types are vertices or lists of vertices but not Rings + * + * SHPT_POLYGON, SHPT_POLYGONZ, SHPT_POLYGONM and SHPT_MULTIPATCH + * can have SHPObjects that are compound as well as complex + * + * SHP_POINT and its Z and M derivatives are strictly simple + * MULTI_POINT, SHPT_ARC and their derivatives may be simple or compound + * + */ + + +#ifndef SHPGEO_H + +#define SHPGEO_H + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PROJ4 +#include "proj_api.h" +#else +typedef void* projPJ; +#endif + +#define SHPD_POINT 1 +#define SHPD_LINE 2 +#define SHPD_AREA 4 +#define SHPD_Z 8 +#define SHPD_MEASURE 16 + + +/* move these into a ogis header file ogis.h */ +#define OGIST_UNKNOWN 0 +#define OGIST_POINT 1 +#define OGIST_LINESTRING 2 +#define OGIST_POLYGON 3 +#define OGIST_MULTIPOINT 4 +#define OGIST_MULTILINE 5 +#define OGIST_MULTIPOLYGON 6 +#define OGIST_GEOMCOLL 7 + +typedef struct { int StreamPos; + int NeedSwap; + char *wStream; + } WKBStreamObj; + +typedef struct { double x; double y; } PT; + + +typedef struct { int cParts; + SHPObject *SHPObj; + } SHPObjectList; + + +#define LSB_ORDER (int) 1 + + +extern char * asFileName ( const char *fil, char *ext ); +extern int SHPProject ( SHPObject *psCShape, + projPJ inproj, projPJ outproj ); +extern projPJ SHPSetProjection ( int param_cnt, char **params ); +extern int SHPFreeProjection ( projPJ p); + +extern int SHPDimension ( int SHPType ); + +extern double SHPArea_2d ( SHPObject *psCShape ); +extern int SHPRingDir_2d ( SHPObject *psCShape, int Ring ); +extern double SHPLength_2d ( SHPObject *psCShape ); +extern PT SHPCentrd_2d ( SHPObject *psCShape ); +extern PT SHPPointinPoly_2d ( SHPObject *psCShape ); +extern PT* SHPPointsinPoly_2d ( SHPObject *psCShape ); + +extern int RingCentroid_2d ( int nVertices, double *a, double *b, PT *C, + double *Area ); +extern double RingLength_2d ( int nVertices, double *a, double *b ); +extern int RingDir_2d ( int nVertices, double *a, double *b ); +extern double RingArea_2d ( int nVertices, double *a, double *b ); + +extern SHPObject* SHPClone ( SHPObject *psCShape, int lowPart, int highPart ); +extern SHPObject* SHPUnCompound ( SHPObject *psCShape, int * ringNumber ); +extern SHPObject* SHPIntersect_2d ( SHPObject* a, SHPObject* b ); + +extern int SHPWriteOGisWKB ( WKBStreamObj *stream_obj, SHPObject *psCShape ); +extern SHPObject* SHPReadOGisWKB ( WKBStreamObj *stream_obj ); + +int SHPWriteOGisPolygon ( WKBStreamObj *stream_obj, SHPObject *psCShape ); +int SHPWriteOGisLine ( WKBStreamObj *stream_obj, SHPObject *psCShape ); +int SHPWriteOGisPoint ( WKBStreamObj *stream_obj, SHPObject *psCShape ); + +SHPObject* SHPReadOGisPolygon ( WKBStreamObj *stream_obj ); +SHPObject* SHPReadOGisLine ( WKBStreamObj *stream_obj ); +SHPObject* SHPReadOGisPoint ( WKBStreamObj *stream_obj ); + +extern int SHPClean ( SHPObject *psCShape ); +extern int SHPOGisType ( int GeomType, int toOGis); + +void swapD (void *so, unsigned char *in, long bytes); +void swapW (void *so, unsigned char *in, long bytes); +void SwapG( void *so, void *in, int this_cnt, int this_size ); + + +#ifdef __cplusplus +} +#endif + +#endif /* ndef SHPGEO_H */ diff --git a/support/ShapeLib/contrib/shpinfo.c b/support/ShapeLib/contrib/shpinfo.c new file mode 100644 index 00000000..9fb40997 --- /dev/null +++ b/support/ShapeLib/contrib/shpinfo.c @@ -0,0 +1,118 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * 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. + ****************************************************************************** + * + * requires shapelib 1.2 + * gcc shpinfoj shpopen.o -o shpinfo + * + * + * $Log: shpinfo.c,v $ + * Revision 1.5 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.4 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.3 2002-04-15 21:33:03 warmerda + * Avoid dereference arrays. + * + * Revision 1.2 2002/04/15 18:40:31 warmerda + * Fixed size of adfBnds{Min,Max} as per bug from David Fowler. + * + * Revision 1.1 1999/05/26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * + */ + +#include +#include +#include "shapefil.h" + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP, cSHP; + int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart; + double *padVertices, adfBndsMin[4], adfBndsMax[4]; + const char *pszPlus; + int cShapeType, cEntities, cVertices, cParts, *cpanParts, ci, cPart; + double *cpadVertices, cadBounds[4]; + const char *cpszPlus; + char sType [15]= ""; +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 2 ) + { + printf( "shpinfo shp_file\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( argv[1], "rb" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( hSHP, &nEntities, &nShapeType, adfBndsMin, adfBndsMax ); + + switch ( nShapeType ) { + case SHPT_POINT: + strcpy(sType,"Point"); + break; + + case SHPT_ARC: + strcpy(sType,"Polyline"); + break; + + case SHPT_POLYGON: + strcpy(sType,"Polygon"); + break; + + case SHPT_MULTIPOINT: + strcpy(sType,"MultiPoint"); + break; + } + +/* -------------------------------------------------------------------- */ + printf ("Info for %s\n",argv[1]); + printf ("%s(%d), %d Records in file\n",sType,nShapeType,nEntities); + +/* -------------------------------------------------------------------- */ +/* Print out the file bounds. */ +/* -------------------------------------------------------------------- */ + printf( "File Bounds: (%15.10lg,%15.10lg)\n\t(%15.10lg,%15.10lg)\n", + adfBndsMin[0], adfBndsMin[1], adfBndsMax[0], adfBndsMax[1] ); + + + + SHPClose( hSHP ); +} diff --git a/support/ShapeLib/contrib/shpproj.c b/support/ShapeLib/contrib/shpproj.c new file mode 100644 index 00000000..231c7f72 --- /dev/null +++ b/support/ShapeLib/contrib/shpproj.c @@ -0,0 +1,260 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * 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. + ****************************************************************************** + * + * requires shapelib 1.2 + * gcc shpproj ../shpopen.o ../dbfopen.o shpgeo.o -lm -lproj -o shpproj + * + * this requires linking with the PROJ4.3 projection library available from + * + * ftp://kai.er.usgs.gov/ftp/PROJ.4 + * + * + * SHPGeo must be compiled with -DPROJ4 support + * + * $Log: shpproj.c,v $ + * Revision 1.10 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.9 2002-01-15 14:37:08 warmerda + * upgrade to use proj_api.h + * + * Revision 1.8 2002/01/11 15:47:26 warmerda + * several fixes + * + * Revision 1.7 2002/01/11 15:23:28 warmerda + * use text mode reading and writing .prj files + * + * Revision 1.6 1999/05/26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * Revision 1.2 1999/05/13 19:30:52 warmerda + * Removed libgen.h, added url for PROJ.4, and corrected unsafe return of + * local variable in asFileName(). + * + */ + + +#include +#include +#include +#include "shapefil.h" +#include "shpgeo.h" + +int main( int argc, char ** argv ) +{ + SHPHandle old_SHP, new_SHP; + DBFHandle old_DBF, new_DBF; + int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart, j; + double *padVertices, adBounds[4]; + const char *pszPlus; + DBFFieldType idfld_type; + SHPObject *psCShape; + FILE *ifp = NULL; + int idfld, nflds; + char kv[257] = ""; + char idfldName[120] = ""; + char fldName[120] = ""; + char shpFileName[120] = ""; + char dbfFileName[120] = ""; + char prjFileName[120] = ""; + char parg[80]; + double apeture[4]; + int inarg, outarg; + char *DBFRow = NULL; + +/* for testing only + char *in_args[] = { "init=nad83:1002", "units=us-ft" }; + char *out_args[] = { "proj=utm", "zone=16", "units=m" }; +*/ + + char *in_args[16]; + char *out_args[16]; + int in_argc = 0 , out_argc = 0, outf_arg; + char *arglst; + projPJ orig_prj, new_prj; + va_list myargs, moargs; + + if( argc < 4) + { + printf( "shpproj shp_file new_shp ( -i=in_proj_file | -i=\"in_params\" | -i=geographic ) ( -o=out_info_file | -o=\"out_params\" | -o=geographic ) \n" ); + exit( 1 ); + } + + old_SHP = SHPOpen( argv[1], "rb" ); + old_DBF = DBFOpen( argv[1], "rb" ); + if( old_SHP == NULL || old_DBF == NULL ) + { + printf( "Unable to open old files:%s\n", argv[1] ); + exit( 1 ); + } + + outf_arg = 2; + inarg = 0; + outarg = 0; + for ( i = 3; i < argc; i++ ) { + if ( !strncmp ("-i=", argv[i], 3 )) inarg = i; + if ( !strncmp ("-o=", argv[i], 3 )) outarg = i; + } + + +/* if shapefile has a prj component then use that + else try for a file then read args as list */ + + if( inarg == 0 ) + { + strcpy( prjFileName, argv[1] ); + ifp = fopen( asFileName ( prjFileName, "prj" ),"rt"); + } + else + { + ifp = fopen( asFileName ( argv[inarg] + 3, "prj" ),"rt"); + } + + i = 0; + if ( ifp ) { + if( inarg == 0 ) + printf ("using default file proj params from <- %s\n", + asFileName ( prjFileName, "prj" ) ); + else + printf ("using file proj params from <- %s\n", + asFileName ( argv[inarg] + 3, "prj" ) ); + + while( fscanf( ifp, "%s", parg) != EOF ) { + in_args[i] = malloc ( strlen(parg)+1 ); + strcpy ( in_args[i], parg); + i++; + } + + in_argc = i; + fclose (ifp); + } + else { + if ( inarg > 0 ) { + arglst = argv[inarg] + 3; + j = 0; + i = 0; + while ( j < strlen (arglst) ) { + in_argc += sscanf ( arglst + j, "%s", parg); + + in_args[i] = malloc( strlen (parg)+1); + strcpy (in_args[i], parg); + i++; + j += strlen (parg) +1; + if ( arglst[j] + 1 == 0 ) j = strlen (argv[inarg]); + } + } + } + + i = 0; + if ( outarg > 0 ) ifp = fopen( asFileName ( argv[outarg] + 3, "prj" ),"rt"); + if ( ifp ) { + while( fscanf( ifp, "%s", parg) != EOF ) { + out_args[i] = malloc ( strlen(parg)); + strcpy ( out_args[i], parg); + i++; + } + out_argc = i; + fclose (ifp); + } + else { + if ( outarg > 0 ) { + arglst = argv[outarg] + 3; + j = 0; + i = 0; + while ( j < strlen (arglst) ) { + out_argc += sscanf ( arglst + j, "%s", parg); + + out_args[i] = malloc( strlen (parg)+1); + strcpy (out_args[i], parg); + i++; + j += strlen (parg) +1; + if ( arglst[j] + 1 == 0 ) j = strlen (argv[outarg]); + } + } + } + + if ( !strcmp( argv[inarg], "-i=geographic" )) in_argc = 0; + if ( !strcmp( argv[outarg], "-o=geographic" )) out_argc = 0; + + orig_prj = SHPSetProjection ( in_argc, in_args ); + new_prj = SHPSetProjection ( out_argc, out_args ); + + if ( !(( (!in_argc) || orig_prj) && ( (!out_argc) || new_prj) )) { + fprintf (stderr, "unable to process projection, exiting...\n"); + exit(1); + } + + + SHPGetInfo( old_SHP, &nEntities, &nShapeType, NULL, NULL); + new_SHP = SHPCreate ( argv[outf_arg], nShapeType ); + + new_DBF = DBFCloneEmpty (old_DBF, argv[outf_arg]); + if( new_SHP == NULL || new_DBF == NULL ) + { + printf( "Unable to create new files:%s\n", argv[outf_arg] ); + exit( 1 ); + } + + DBFRow = (char *) malloc ( (old_DBF->nRecordLength) + 15 ); + + for( i = 0; i < nEntities; i++ ) + { + int j; + + psCShape = SHPReadObject ( old_SHP, i ); + + SHPProject (psCShape, orig_prj, new_prj ); + + SHPWriteObject ( new_SHP, -1, psCShape ); + SHPDestroyObject ( psCShape ); + + memcpy ( DBFRow, DBFReadTuple ( old_DBF, i ), old_DBF->nRecordLength ); + DBFWriteTuple ( new_DBF, new_DBF->nRecords, DBFRow ); + + } + + SHPFreeProjection ( orig_prj ); + SHPFreeProjection ( new_prj ); + + /* store projection params into prj file */ + ifp = fopen( asFileName ( argv[outf_arg], "prj" ),"wt"); + if ( ifp ) { + + if ( out_argc == 0 ) + { fprintf( ifp, "proj=geographic\n" ); } + else + { for ( i = 0; i < out_argc; i++ ) + fprintf( ifp, "%s\n", out_args[i]); + } + fclose (ifp); + } + + SHPClose( old_SHP ); + SHPClose( new_SHP ); + DBFClose( old_DBF ); + DBFClose( new_DBF ); + printf ("\n"); +} + + diff --git a/support/ShapeLib/contrib/shpsort.c b/support/ShapeLib/contrib/shpsort.c new file mode 100644 index 00000000..ae0bf6f4 --- /dev/null +++ b/support/ShapeLib/contrib/shpsort.c @@ -0,0 +1,605 @@ +/****************************************************************************** + * Copyright (c) 2004, Eric G. Miller + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * 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. + ****************************************************************************** + * shpsort + * + * Rewrite a shapefile sorted by a field or by the geometry. For polygons, + * sort by area, for lines sort by length and do nothing for all others. + * + * $Log: shpsort.c,v $ + * Revision 1.3 2004-07-06 21:23:17 fwarmerdam + * minor const warning fix + * + * Revision 1.2 2004/07/06 21:20:49 fwarmerdam + * major upgrade .. sort on multiple fields + * + * Revision 1.4 2004/06/30 18:19:53 emiller + * handle POINTZ, POINTM + * + * Revision 1.3 2004/06/30 17:40:32 emiller + * major rewrite allows sorting on multiple fields. + * + * Revision 1.2 2004/06/23 23:19:58 emiller + * use tuple copy, misc changes + * + * Revision 1.1 2004/06/23 21:38:17 emiller + * Initial revision + * + * + */ + +#include +#include +#include +#include +#include +#include "shapefil.h" + +enum FieldOrderEnum {DESCENDING, ASCENDING}; +enum FieldTypeEnum { + FIDType = -2, + SHPType = -1, + StringType = FTString, + LogicalType = FTLogical, + IntegerType = FTInteger, + DoubleType = FTDouble +}; + +struct DataUnion { + int null; + union { + int i; + double d; + char *s; + } u; +}; + +struct DataStruct { + int record; + struct DataUnion *value; +}; + +/* + globals used in sorting, each element could have a pointer to + a single data struct, but that's still nShapes pointers more + memory. Alternatively, write a custom sort rather than using + library qsort. +*/ +int nFields; +int *fldIdx; +int *fldOrder; +int *fldType; +int shpType; +int nShapes; + +static struct DataStruct * build_index (SHPHandle shp, DBFHandle dbf); +static char * dupstr (const char *); +static void copy_related (const char *inName, const char *outName, + const char *old_ext, const char *new_ext); +static char ** split(const char *arg, const char *delim); +static int compare(const void *, const void *); +static double area2d_polygon (int n, double *x, double *y); +static double shp_area (SHPObject *feat); +static double length2d_polyline (int n, double *x, double *y); +static double shp_length (SHPObject *feat); + +int main (int argc, char *argv[]) { + + SHPHandle inSHP, outSHP; + DBFHandle inDBF, outDBF; + int len; + int i; + char **fieldNames; + char **strOrder = 0; + struct DataStruct *index; + int width; + int decimals; + SHPObject *feat; + void *tuple; + + if (argc < 4) { + printf("USAGE: shpsort [<(ASCENDING|DESCENDING)[;...]>]\n"); + exit(EXIT_FAILURE); + } + + inSHP = SHPOpen (argv[1], "rb"); + if (!inSHP) { + fputs("Couldn't open shapefile for reading!\n", stderr); + exit(EXIT_FAILURE); + } + SHPGetInfo(inSHP, &nShapes, &shpType, NULL, NULL); + + /* If we can open the inSHP, open its DBF */ + inDBF = DBFOpen (argv[1], "rb"); + if (!inDBF) { + fputs("Couldn't open dbf file for reading!\n", stderr); + exit(EXIT_FAILURE); + } + + /* Parse fields and validate existence */ + fieldNames = split(argv[3], ";"); + if (!fieldNames) { + fputs("ERROR: parsing field names!\n", stderr); + exit(EXIT_FAILURE); + } + for (nFields = 0; fieldNames[nFields] ; nFields++) { + continue; + } + + fldIdx = malloc(sizeof *fldIdx * nFields); + if (!fldIdx) { + fputs("malloc failed!\n", stderr); + exit(EXIT_FAILURE); + } + for (i = 0; i < nFields; i++) { + len = (int)strlen(fieldNames[i]); + while(len > 0) { + --len; + fieldNames[i][len] = (char)toupper((unsigned char)fieldNames[i][len]); + } + fldIdx[i] = DBFGetFieldIndex(inDBF, fieldNames[i]); + if (fldIdx[i] < 0) { + /* try "SHAPE" */ + if (strcmp(fieldNames[i], "SHAPE") == 0) { + fldIdx[i] = -1; + } + else if (strcmp(fieldNames[i], "FID") == 0) { + fldIdx[i] = -2; + } + else { + fprintf(stderr, "ERROR: field '%s' not found!\n", fieldNames[i]); + exit(EXIT_FAILURE); + } + } + } + + + /* set up field type array */ + fldType = malloc(sizeof *fldType * nFields); + if (!fldType) { + fputs("malloc failed!\n", stderr); + exit(EXIT_FAILURE); + } + for (i = 0; i < nFields; i++) { + if (fldIdx[i] < 0) { + fldType[i] = fldIdx[i]; + } + else { + fldType[i] = DBFGetFieldInfo(inDBF, fldIdx[i], NULL, &width, &decimals); + if (fldType[i] == FTInvalid) { + fputs("Unrecognized field type in dBASE file!\n", stderr); + exit(EXIT_FAILURE); + } + } + } + + + /* set up field order array */ + fldOrder = malloc(sizeof *fldOrder * nFields); + if (!fldOrder) { + fputs("malloc failed!\n", stderr); + exit(EXIT_FAILURE); + } + for (i = 0; i < nFields; i++) { + /* default to ascending order */ + fldOrder[i] = ASCENDING; + } + if (argc > 4) { + strOrder = split(argv[4], ";"); + if (!strOrder) { + fputs("ERROR: parsing fields ordering!\n", stderr); + exit(EXIT_FAILURE); + } + for (i = 0; i < nFields && strOrder[i]; i++) { + if (strcmp(strOrder[i], "DESCENDING") == 0) { + fldOrder[i] = DESCENDING; + } + } + } + + /* build the index */ + index = build_index (inSHP, inDBF); + + /* Create output shapefile */ + outSHP = SHPCreate(argv[2], shpType); + if (!outSHP) { + fprintf(stderr, "%s:%d: couldn't create output shapefile!\n", + __FILE__, __LINE__); + exit(EXIT_FAILURE); + } + + /* Create output dbf */ + outDBF = DBFCloneEmpty(inDBF, argv[2]); + if (!outDBF) { + fprintf(stderr, "%s:%d: couldn't create output dBASE file!\n", + __FILE__, __LINE__); + exit(EXIT_FAILURE); + } + + /* Copy projection file, if any */ + copy_related(argv[1], argv[2], ".shp", ".prj"); + + /* Copy metadata file, if any */ + copy_related(argv[1], argv[2], ".shp", ".shp.xml"); + + /* Write out sorted results */ + for (i = 0; i < nShapes; i++) { + feat = SHPReadObject(inSHP, index[i].record); + if (SHPWriteObject(outSHP, -1, feat) < 0) { + fprintf(stderr, "%s:%d: error writing shapefile!\n", __FILE__, __LINE__); + exit(EXIT_FAILURE); + } + tuple = (void *) DBFReadTuple(inDBF, index[i].record); + if (DBFWriteTuple(outDBF, i, tuple) < 0) { + fprintf(stderr, "%s:%d: error writing dBASE file!\n", __FILE__, __LINE__); + exit(EXIT_FAILURE); + } + } + SHPClose(inSHP); + SHPClose(outSHP); + DBFClose(inDBF); + DBFClose(outDBF); + + return EXIT_SUCCESS; + +} + +static char ** split(const char *arg, const char *delim) +{ + char *copy = dupstr(arg); + char *cptr = copy; + char **result = NULL; + char **tmp; + int i = 0; + + for (cptr = strtok(copy, delim); cptr; cptr = strtok(NULL, delim)) { + tmp = realloc (result, sizeof *result * (i + 1)); + if (!tmp && result) { + while (i > 0) { + free(result[--i]); + } + free(result); + free(copy); + return NULL; + } + result = tmp; + result[i++] = dupstr(cptr); + } + + free(copy); + + if (i) { + tmp = realloc(result, sizeof *result * (i + 1)); + if (!tmp) { + while (i > 0) { + free(result[--i]); + } + free(result); + free(copy); + return NULL; + } + result = tmp; + result[i++] = NULL; + } + + return result; +} + + +static void copy_related (const char *inName, const char *outName, + const char *old_ext, const char *new_ext) +{ + char *in; + char *out; + FILE *inFile; + FILE *outFile; + int c; + size_t name_len = strlen(inName); + size_t old_len = strlen(old_ext); + size_t new_len = strlen(new_ext); + + in = malloc(name_len - old_len + new_len + 1); + strncpy(in, inName, (name_len - old_len)); + strcpy(&in[(name_len - old_len)], new_ext); + inFile = fopen(in, "rb"); + if (!inFile) { + free(in); + return; + } + name_len = strlen(outName); + out = malloc(name_len - old_len + new_len + 1); + strncpy(out, outName, (name_len - old_len)); + strcpy(&out[(name_len - old_len)], new_ext); + outFile = fopen(out, "wb"); + if (!out) { + fprintf(stderr, "%s:%d: couldn't copy related file!\n", + __FILE__, __LINE__); + free(in); + free(out); + return; + } + while ((c = fgetc(inFile)) != EOF) { + fputc(c, outFile); + } + fclose(inFile); + fclose(outFile); + free(in); + free(out); +} + +static char * dupstr (const char *src) +{ + char *dst = malloc(strlen(src) + 1); + char *cptr; + if (!dst) { + fprintf(stderr, "%s:%d: malloc failed!\n", __FILE__, __LINE__); + exit(EXIT_FAILURE); + } + cptr = dst; + while ((*cptr++ = *src++)) + ; + return dst; +} + +#ifdef DEBUG +static void PrintDataStruct (struct DataStruct *data) { + int i, j; + for (i = 0; i < nShapes; i++) { + printf("data[%d] {\n", i); + printf("\t.record = %d\n", data[i].record); + for (j = 0; j < nFields; j++) { + printf("\t.value[%d].null = %d\n", j, data[i].value[j].null); + if (!data[i].value[j].null) { + switch(fldType[j]) { + case FIDType: + case IntegerType: + case LogicalType: + printf("\t.value[%d].u.i = %d\n", j, data[i].value[j].u.i); + break; + case DoubleType: + case SHPType: + printf("\t.value[%d].u.d = %f\n", j, data[i].value[j].u.d); + break; + case StringType: + printf("\t.value[%d].u.s = %s\n", j, data[i].value[j].u.s); + break; + } + } + } + puts("}"); + } +} +#endif + +static struct DataStruct * build_index (SHPHandle shp, DBFHandle dbf) { + struct DataStruct *data; + SHPObject *feat; + int i; + int j; + + /* make array */ + data = malloc (sizeof *data * nShapes); + if (!data) { + fputs("malloc failed!\n", stderr); + exit(EXIT_FAILURE); + } + + /* populate array */ + for (i = 0; i < nShapes; i++) { + data[i].value = malloc(sizeof data[0].value[0] * nFields); + if (0 == data[i].value) { + fputs("malloc failed!\n", stderr); + exit(EXIT_FAILURE); + } + data[i].record = i; + for (j = 0; j < nFields; j++) { + data[i].value[j].null = 0; + switch (fldType[j]) { + case FIDType: + data[i].value[j].u.i = i; + break; + case SHPType: + feat = SHPReadObject(shp, i); + switch (feat->nSHPType) { + case SHPT_NULL: + fprintf(stderr, "Shape %d is a null feature!\n", i); + data[i].value[j].null = 1; + break; + case SHPT_POINT: + case SHPT_POINTZ: + case SHPT_POINTM: + case SHPT_MULTIPOINT: + case SHPT_MULTIPOINTZ: + case SHPT_MULTIPOINTM: + case SHPT_MULTIPATCH: + /* Y-sort bounds */ + data[i].value[j].u.d = feat->dfYMax; + break; + case SHPT_ARC: + case SHPT_ARCZ: + case SHPT_ARCM: + data[i].value[j].u.d = shp_length(feat); + break; + case SHPT_POLYGON: + case SHPT_POLYGONZ: + case SHPT_POLYGONM: + data[i].value[j].u.d = shp_area(feat); + break; + default: + fputs("Can't sort on Shapefile feature type!\n", stderr); + exit(EXIT_FAILURE); + } + SHPDestroyObject(feat); + break; + case FTString: + data[i].value[j].null = DBFIsAttributeNULL(dbf, i, fldIdx[j]); + if (!data[i].value[j].null) { + data[i].value[j].u.s = dupstr(DBFReadStringAttribute(dbf, i, fldIdx[j])); + } + break; + case FTInteger: + case FTLogical: + data[i].value[j].null = DBFIsAttributeNULL(dbf, i, fldIdx[j]); + if (!data[i].value[j].null) { + data[i].value[j].u.i = DBFReadIntegerAttribute(dbf, i, fldIdx[j]); + } + break; + case FTDouble: + data[i].value[j].null = DBFIsAttributeNULL(dbf, i, fldIdx[j]); + if (!data[i].value[j].null) { + data[i].value[j].u.d = DBFReadDoubleAttribute(dbf, i, fldIdx[j]); + } + break; + } + } + } + +#ifdef DEBUG + PrintDataStruct(data); + fputs("build_index: sorting array\n", stdout); +#endif + + qsort (data, nShapes, sizeof data[0], compare); + +#ifdef DEBUG + PrintDataStruct(data); + fputs("build_index: returning array\n", stdout); +#endif + + return data; +} + +static int compare(const void *A, const void *B) { + const struct DataStruct *a = A; + const struct DataStruct *b = B; + int i; + int result = 0; + + for (i = 0; i < nFields; i++) { + if (a->value[i].null && b->value[i].null) { + continue; + } + if (a->value[i].null && !b->value[i].null) { + return (fldOrder[i]) ? 1 : -1; + } + if (!a->value[i].null && b->value[i].null) { + return (fldOrder[i]) ? -1 : 1; + } + switch (fldType[i]) { + case FIDType: + case IntegerType: + case LogicalType: + if (a->value[i].u.i < b->value[i].u.i) { + return (fldOrder[i]) ? -1 : 1; + } + if (a->value[i].u.i > b->value[i].u.i) { + return (fldOrder[i]) ? 1 : -1; + } + break; + case DoubleType: + case SHPType: + if (a->value[i].u.d < b->value[i].u.d) { + return (fldOrder[i]) ? -1 : 1; + } + if (a->value[i].u.d > b->value[i].u.d) { + return (fldOrder[i]) ? 1 : -1; + } + break; + case StringType: + result = strcmp(a->value[i].u.s, b->value[i].u.s); + if (result) { + return (fldOrder[i]) ? result : -result; + } + break; + default: + fprintf(stderr, "compare: Program Error! Unhandled field type! fldType[%d] = %d\n", i, fldType[i]); + break; + } + } + return 0; +} + +static double area2d_polygon (int n, double *x, double *y) { + double area = 0; + int i; + for (i = 1; i < n; i++) { + area += (x[i-1] + x[i]) * (y[i] - y[i-1]); + } + return area / 2.0; +} + +static double shp_area (SHPObject *feat) { + double area = 0.0; + if (feat->nParts == 0) { + area = area2d_polygon (feat->nVertices, feat->padfX, feat->padfY); + } + else { + int part, n; + for (part = 0; part < feat->nParts; part++) { + if (part < feat->nParts - 1) { + n = feat->panPartStart[part+1] - feat->panPartStart[part]; + } + else { + n = feat->nVertices - feat->panPartStart[part]; + } + area += area2d_polygon (n, &(feat->padfX[feat->panPartStart[part]]), + &(feat->padfY[feat->panPartStart[part]])); + } + } + /* our area function computes in opposite direction */ + return -area; +} + +static double length2d_polyline (int n, double *x, double *y) { + double length = 0.0; + int i; + for (i = 1; i < n; i++) { + length += sqrt((x[i] - x[i-1])*(x[i] - x[i-1]) + + + (y[i] - y[i-1])*(y[i] - y[i-1])); + } + return length; +} + +static double shp_length (SHPObject *feat) { + double length = 0.0; + if (feat->nParts == 0) { + length = length2d_polyline(feat->nVertices, feat->padfX, feat->padfY); + } + else { + int part, n; + for (part = 0; part < feat->nParts; part++) { + if (part < feat->nParts - 1) { + n = feat->panPartStart[part+1] - feat->panPartStart[part]; + } + else { + n = feat->nVertices - feat->panPartStart[part]; + } + length += length2d_polyline (n, + &(feat->padfX[feat->panPartStart[part]]), + &(feat->padfY[feat->panPartStart[part]])); + } + } + return length; +} + diff --git a/support/ShapeLib/contrib/shpwkb.c b/support/ShapeLib/contrib/shpwkb.c new file mode 100644 index 00000000..f27114ee --- /dev/null +++ b/support/ShapeLib/contrib/shpwkb.c @@ -0,0 +1,129 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * this code is based in part on the earlier work of Frank Warmerdam + * + * 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. + ****************************************************************************** + * + * shpwkb.c - test WKB binary Input / Output + * + * + * $Log: shpwkb.c,v $ + * Revision 1.2 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.1 1999-05-26 02:29:36 candrsn + * OGis Well Known Binary test program (output only) + * + * + * + */ + +#include +#include "shapefil.h" +#include "shpgeo.h" + +int main( int argc, char ** argv ) +{ + SHPHandle old_SHP, new_SHP; + DBFHandle old_DBF, new_DBF; + int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart; + double *padVertices, adBounds[4]; + const char *pszPlus; + DBFFieldType idfld_type; + int idfld, nflds; + char kv[257] = ""; + char idfldName[120] = ""; + char fldName[120] = ""; + char shpFileName[120] = ""; + char dbfFileName[120] = ""; + char *DBFRow = NULL; + int Cpan[2] = { 0,0 }; + int byRing = 0; + PT oCentrd, ringCentrd; + SHPObject *psCShape, *cent_pt; + double oArea = 0.0, oLen = 0.0; + WKBStreamObj *wkbObj = NULL; + FILE *wkb_file = NULL; + + if( argc < 3 ) + { + printf( "shpwkb shp_file wkb_file\n" ); + exit( 1 ); + } + + old_SHP = SHPOpen (argv[1], "rb" ); + old_DBF = DBFOpen (argv[1], "rb"); + if( old_SHP == NULL || old_DBF == NULL ) + { + printf( "Unable to open old files:%s\n", argv[1] ); + exit( 1 ); + } + + wkb_file = fopen ( argv[2], "wb"); + wkbObj = calloc ( 3, sizeof (int) ); + + SHPGetInfo( old_SHP, &nEntities, &nShapeType, NULL, NULL ); + for( i = 0; i < nEntities; i++ ) + { + int res ; + + psCShape = SHPReadObject( old_SHP, i ); + + if ( byRing == 1 ) { + int ring, prevStart, ringDir; + double ringArea; + + prevStart = psCShape->nVertices; + for ( ring = (psCShape->nParts - 1); ring >= 0; ring-- ) { + SHPObject *psO; + int j, numVtx, rStart; + + rStart = psCShape->panPartStart[ring]; + if ( ring == (psCShape->nParts -1) ) + { numVtx = psCShape->nVertices - rStart; } + else + { numVtx = psCShape->panPartStart[ring+1] - rStart; } + + printf ("(shpdata) Ring(%d) (%d for %d) \n", ring, rStart, numVtx); + psO = SHPClone ( psCShape, ring, ring + 1 ); + + SHPDestroyObject ( psO ); + printf ("(shpdata) End Ring \n"); + } /* (ring) [0,nParts */ + + } /* by ring */ + + printf ("gonna build a wkb \n"); + res = SHPWriteOGisWKB ( wkbObj, psCShape ); + printf ("gonna write a wkb that is %d bytes long \n", wkbObj->StreamPos ); + fwrite ( (void*) wkbObj->wStream, 1, wkbObj->StreamPos, wkb_file ); + } + + + free ( wkbObj ); + SHPClose( old_SHP ); + DBFClose( old_DBF ); + if ( wkb_file ) fclose ( wkb_file ); + + printf ("\n"); +} diff --git a/support/ShapeLib/contrib/tests/shpproj.sh b/support/ShapeLib/contrib/tests/shpproj.sh new file mode 100644 index 00000000..4f1ceb5d --- /dev/null +++ b/support/ShapeLib/contrib/tests/shpproj.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +testdir="$(dirname "$(readlink -f $0)")" + +rm -f "$testdir/test*" +$top_builddir/shpcreate "$testdir/test" point + +$top_builddir/shpadd "$testdir/test" -83.54949956 34.992401 +$top_builddir/shpadd "$testdir/test" -83.52162155 34.99276748 +$top_builddir/shpadd "$testdir/test" -84.01681518 34.67275985 +$top_builddir/shpadd "$testdir/test" -84.15596023 34.64862437 +$top_builddir/shpadd "$testdir/test" -83.61951463 34.54927047 + +$top_builddir/dbfcreate "$testdir/test" -s fd 30 +$top_builddir/dbfadd "$testdir/test" "1" +$top_builddir/dbfadd "$testdir/test" "2" +$top_builddir/dbfadd "$testdir/test" "3" +$top_builddir/dbfadd "$testdir/test" "4" +$top_builddir/dbfadd "$testdir/test" "5" + +$top_builddir/contrib/shpproj "$testdir/test" "$testdir/test_1" -i=geographic -o="init=nad83:1002 units=us-ft" +$top_builddir/contrib/shpproj "$testdir/test_1" "$testdir/test_2" -o="proj=utm zone=16 units=m" +$top_builddir/contrib/shpproj "$testdir/test_2" "$testdir/test_3" -o=geographic + +$top_builddir/shpdump -precision 8 "$testdir/test" > "$testdir/test.out" +$top_builddir/shpdump -precision 8 "$testdir/test_3" > "$testdir/test_3.out" + + +result="$(diff "$testdir/test.out" "$testdir/test_3.out")" +if [ "$result" == "" ]; then + echo "******* Test Succeeded *********" + rm -f "$testdir/test*" + exit 0 +else + echo "******* Test Failed *********" + echo "$result" + rm -f "$testdir/test*" + exit 1 +fi diff --git a/support/ShapeLib/dbfadd.c b/support/ShapeLib/dbfadd.c new file mode 100644 index 00000000..0c57ef80 --- /dev/null +++ b/support/ShapeLib/dbfadd.c @@ -0,0 +1,133 @@ +/****************************************************************************** + * $Id: dbfadd.c,v 1.10 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for adding a record to an existing .dbf file. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: dbfadd.c,v $ + * Revision 1.10 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.9 2004-09-26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.8 2004/01/09 16:39:49 fwarmerdam + * include standard include files + * + * Revision 1.7 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.6 2001/05/31 18:15:40 warmerda + * Added support for NULL fields in DBF files + * + * Revision 1.5 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.4 1998/12/03 16:36:06 warmerda + * Added stdlib.h and math.h to get atof() prototype. + * + * Revision 1.3 1995/10/21 03:13:23 warmerda + * Use binary mode.. + * + * Revision 1.2 1995/08/04 03:15:59 warmerda + * Added header. + * + */ + +#include +#include +#include + +#include "shapefil.h" + +SHP_CVSID("$Id: dbfadd.c,v 1.10 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + DBFHandle hDBF; + int i, iRecord; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc < 3 ) + { + printf( "dbfadd xbase_file field_values\n" ); + + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Create the database. */ +/* -------------------------------------------------------------------- */ + hDBF = DBFOpen( argv[1], "r+b" ); + if( hDBF == NULL ) + { + printf( "DBFOpen(%s,\"rb+\") failed.\n", argv[1] ); + exit( 2 ); + } + +/* -------------------------------------------------------------------- */ +/* Do we have the correct number of arguments? */ +/* -------------------------------------------------------------------- */ + if( DBFGetFieldCount( hDBF ) != argc - 2 ) + { + printf( "Got %d fields, but require %d\n", + argc - 2, DBFGetFieldCount( hDBF ) ); + exit( 3 ); + } + + iRecord = DBFGetRecordCount( hDBF ); + +/* -------------------------------------------------------------------- */ +/* Loop assigning the new field values. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < DBFGetFieldCount(hDBF); i++ ) + { + if( strcmp( argv[i+2], "" ) == 0 ) + DBFWriteNULLAttribute(hDBF, iRecord, i ); + else if( DBFGetFieldInfo( hDBF, i, NULL, NULL, NULL ) == FTString ) + DBFWriteStringAttribute(hDBF, iRecord, i, argv[i+2] ); + else + DBFWriteDoubleAttribute(hDBF, iRecord, i, atof(argv[i+2]) ); + } + +/* -------------------------------------------------------------------- */ +/* Close and cleanup. */ +/* -------------------------------------------------------------------- */ + DBFClose( hDBF ); + + return( 0 ); +} diff --git a/support/ShapeLib/dbfcreate.c b/support/ShapeLib/dbfcreate.c new file mode 100644 index 00000000..13238b30 --- /dev/null +++ b/support/ShapeLib/dbfcreate.c @@ -0,0 +1,131 @@ +/****************************************************************************** + * $Id: dbfcreate.c,v 1.8 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for creating a new .dbf file. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: dbfcreate.c,v $ + * Revision 1.8 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.7 2004-09-26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.6 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.5 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.4 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.3 1999/04/01 18:47:44 warmerda + * Fixed DBFAddField() call convention. + * + * Revision 1.2 1995/08/04 03:17:11 warmerda + * Added header. + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: dbfcreate.c,v 1.8 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + DBFHandle hDBF; + int i; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc < 2 ) + { + printf( "dbfcreate xbase_file [[-s field_name width],[-n field_name width decimals]]...\n" ); + + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Create the database. */ +/* -------------------------------------------------------------------- */ + hDBF = DBFCreate( argv[1] ); + if( hDBF == NULL ) + { + printf( "DBFCreate(%s) failed.\n", argv[1] ); + exit( 2 ); + } + +/* -------------------------------------------------------------------- */ +/* Loop over the field definitions adding new fields. */ +/* -------------------------------------------------------------------- */ + for( i = 2; i < argc; i++ ) + { + if( strcmp(argv[i],"-s") == 0 && i < argc-2 ) + { + if( DBFAddField( hDBF, argv[i+1], FTString, atoi(argv[i+2]), 0 ) + == -1 ) + { + printf( "DBFAddField(%s,FTString,%d,0) failed.\n", + argv[i+1], atoi(argv[i+2]) ); + exit( 4 ); + } + i = i + 2; + } + else if( strcmp(argv[i],"-n") == 0 && i < argc-3 ) + { + if( DBFAddField( hDBF, argv[i+1], FTDouble, atoi(argv[i+2]), + atoi(argv[i+3]) ) == -1 ) + { + printf( "DBFAddField(%s,FTDouble,%d,%d) failed.\n", + argv[i+1], atoi(argv[i+2]), atoi(argv[i+3]) ); + exit( 4 ); + } + i = i + 3; + } + else + { + printf( "Argument incomplete, or unrecognised:%s\n", argv[i] ); + exit( 3 ); + } + } + + DBFClose( hDBF ); + + return( 0 ); +} diff --git a/support/ShapeLib/dbfdump.c b/support/ShapeLib/dbfdump.c new file mode 100644 index 00000000..bb3afdf8 --- /dev/null +++ b/support/ShapeLib/dbfdump.c @@ -0,0 +1,295 @@ +/****************************************************************************** + * $Id: dbfdump.c,v 1.14 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for dumping .dbf files to the terminal. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: dbfdump.c,v $ + * Revision 1.14 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.13 2013-11-26 21:52:33 fwarmerdam + * report deleted rows in dbfdump + * + * Revision 1.12 2006-06-17 00:15:08 fwarmerdam + * Free panWidth for better memory testing. + * + * Revision 1.11 2006/02/15 01:11:27 fwarmerdam + * added reporting of native type + * + * Revision 1.10 2004/09/26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.9 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.8 2001/05/31 18:15:40 warmerda + * Added support for NULL fields in DBF files + * + * Revision 1.7 2000/09/20 13:13:55 warmerda + * added break after default: + * + * Revision 1.6 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.5 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.4 1998/12/31 15:30:13 warmerda + * Added -m, -r, and -h commandline options. + * + * Revision 1.3 1995/10/21 03:15:01 warmerda + * Changed to use binary file access. + * + * Revision 1.2 1995/08/04 03:16:22 warmerda + * Added header. + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: dbfdump.c,v 1.14 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + DBFHandle hDBF; + int *panWidth, i, iRecord; + char szFormat[32], *pszFilename = NULL; + int nWidth, nDecimals; + int bHeader = 0; + int bRaw = 0; + int bMultiLine = 0; + char szTitle[12]; + +/* -------------------------------------------------------------------- */ +/* Handle arguments. */ +/* -------------------------------------------------------------------- */ + for( i = 1; i < argc; i++ ) + { + if( strcmp(argv[i],"-h") == 0 ) + bHeader = 1; + else if( strcmp(argv[i],"-r") == 0 ) + bRaw = 1; + else if( strcmp(argv[i],"-m") == 0 ) + bMultiLine = 1; + else + pszFilename = argv[i]; + } + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( pszFilename == NULL ) + { + printf( "dbfdump [-h] [-r] [-m] xbase_file\n" ); + printf( " -h: Write header info (field descriptions)\n" ); + printf( " -r: Write raw field info, numeric values not reformatted\n" ); + printf( " -m: Multiline, one line per field.\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the file. */ +/* -------------------------------------------------------------------- */ + hDBF = DBFOpen( pszFilename, "rb" ); + if( hDBF == NULL ) + { + printf( "DBFOpen(%s,\"r\") failed.\n", argv[1] ); + exit( 2 ); + } + +/* -------------------------------------------------------------------- */ +/* If there is no data in this file let the user know. */ +/* -------------------------------------------------------------------- */ + if( DBFGetFieldCount(hDBF) == 0 ) + { + printf( "There are no fields in this table!\n" ); + exit( 3 ); + } + +/* -------------------------------------------------------------------- */ +/* Dump header definitions. */ +/* -------------------------------------------------------------------- */ + if( bHeader ) + { + for( i = 0; i < DBFGetFieldCount(hDBF); i++ ) + { + DBFFieldType eType; + const char *pszTypeName; + char chNativeType; + + chNativeType = DBFGetNativeFieldType( hDBF, i ); + + eType = DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals ); + if( eType == FTString ) + pszTypeName = "String"; + else if( eType == FTInteger ) + pszTypeName = "Integer"; + else if( eType == FTDouble ) + pszTypeName = "Double"; + else if( eType == FTInvalid ) + pszTypeName = "Invalid"; + + printf( "Field %d: Type=%c/%s, Title=`%s', Width=%d, Decimals=%d\n", + i, chNativeType, pszTypeName, szTitle, nWidth, nDecimals ); + } + } + +/* -------------------------------------------------------------------- */ +/* Compute offsets to use when printing each of the field */ +/* values. We make each field as wide as the field title+1, or */ +/* the field value + 1. */ +/* -------------------------------------------------------------------- */ + panWidth = (int *) malloc( DBFGetFieldCount( hDBF ) * sizeof(int) ); + + for( i = 0; i < DBFGetFieldCount(hDBF) && !bMultiLine; i++ ) + { + DBFFieldType eType; + + eType = DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals ); + if( (int) strlen(szTitle) > nWidth ) + panWidth[i] = strlen(szTitle); + else + panWidth[i] = nWidth; + + if( eType == FTString ) + sprintf( szFormat, "%%-%ds ", panWidth[i] ); + else + sprintf( szFormat, "%%%ds ", panWidth[i] ); + printf( szFormat, szTitle ); + } + printf( "\n" ); + +/* -------------------------------------------------------------------- */ +/* Read all the records */ +/* -------------------------------------------------------------------- */ + for( iRecord = 0; iRecord < DBFGetRecordCount(hDBF); iRecord++ ) + { + if( bMultiLine ) + printf( "Record: %d\n", iRecord ); + + for( i = 0; i < DBFGetFieldCount(hDBF); i++ ) + { + DBFFieldType eType; + + eType = DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals ); + + if( bMultiLine ) + { + printf( "%s: ", szTitle ); + } + +/* -------------------------------------------------------------------- */ +/* Print the record according to the type and formatting */ +/* information implicit in the DBF field description. */ +/* -------------------------------------------------------------------- */ + if( !bRaw ) + { + if( DBFIsAttributeNULL( hDBF, iRecord, i ) ) + { + if( eType == FTString ) + sprintf( szFormat, "%%-%ds", nWidth ); + else + sprintf( szFormat, "%%%ds", nWidth ); + + printf( szFormat, "(NULL)" ); + } + else + { + switch( eType ) + { + case FTString: + sprintf( szFormat, "%%-%ds", nWidth ); + printf( szFormat, + DBFReadStringAttribute( hDBF, iRecord, i ) ); + break; + + case FTInteger: + sprintf( szFormat, "%%%dd", nWidth ); + printf( szFormat, + DBFReadIntegerAttribute( hDBF, iRecord, i ) ); + break; + + case FTDouble: + sprintf( szFormat, "%%%d.%dlf", nWidth, nDecimals ); + printf( szFormat, + DBFReadDoubleAttribute( hDBF, iRecord, i ) ); + break; + + default: + break; + } + } + } + +/* -------------------------------------------------------------------- */ +/* Just dump in raw form (as formatted in the file). */ +/* -------------------------------------------------------------------- */ + else + { + sprintf( szFormat, "%%-%ds", nWidth ); + printf( szFormat, + DBFReadStringAttribute( hDBF, iRecord, i ) ); + } + +/* -------------------------------------------------------------------- */ +/* Write out any extra spaces required to pad out the field */ +/* width. */ +/* -------------------------------------------------------------------- */ + if( !bMultiLine ) + { + sprintf( szFormat, "%%%ds", panWidth[i] - nWidth + 1 ); + printf( szFormat, "" ); + } + + if( bMultiLine ) + printf( "\n" ); + + fflush( stdout ); + } + + if( DBFIsRecordDeleted(hDBF, iRecord) ) + printf( "(DELETED)" ); + + printf( "\n" ); + } + + DBFClose( hDBF ); + free( panWidth ); + + return( 0 ); +} diff --git a/support/ShapeLib/dbfopen.c b/support/ShapeLib/dbfopen.c new file mode 100644 index 00000000..0a71dadd --- /dev/null +++ b/support/ShapeLib/dbfopen.c @@ -0,0 +1,2417 @@ +/****************************************************************************** + * $Id: dbfopen.c 37046 2016-12-31 09:59:57Z rouault $ + * + * Project: Shapelib + * Purpose: Implementation of .dbf access API documented in dbf_api.html. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * Copyright (c) 2012-2013, Even Rouault + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: dbfopen.c,v $ + * Revision 1.92 2016-12-05 18:44:08 erouault + * * dbfopen.c, shapefil.h: write DBF end-of-file character 0x1A by default. + * This behaviour can be controlled with the DBFSetWriteEndOfFileChar() + * function. + * + * Revision 1.91 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.90 2016-12-04 15:30:15 erouault + * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with + * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo + * structures extended with new members. New functions: + * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, + * SHPSetFastModeReadObject + * + * * sbnsearch.c: new file to implement original ESRI .sbn spatial + * index reading. (no write support). New functions: + * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, + * SBNSearchDiskTreeInteger, SBNSearchFreeIds + * + * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates + * with new file and symbols. + * + * * commit: helper script to cvs commit + * + * Revision 1.89 2011-07-24 05:59:25 fwarmerdam + * minimize use of CPLError in favor of SAHooks.Error() + * + * Revision 1.88 2011-05-13 17:35:17 fwarmerdam + * added DBFReorderFields() and DBFAlterFields() functions (from Even) + * + * Revision 1.87 2011-05-07 22:41:02 fwarmerdam + * ensure pending record is flushed when adding a native field (GDAL #4073) + * + * Revision 1.86 2011-04-17 15:15:29 fwarmerdam + * Removed unused variable. + * + * Revision 1.85 2010-12-06 16:09:34 fwarmerdam + * fix buffer read overrun fetching code page (bug 2276) + * + * Revision 1.84 2009-10-29 19:59:48 fwarmerdam + * avoid crash on truncated header (gdal #3093) + * + * Revision 1.83 2008/11/12 14:28:15 fwarmerdam + * DBFCreateField() now works on files with records + * + * Revision 1.82 2008/11/11 17:47:09 fwarmerdam + * added DBFDeleteField() function + * + * Revision 1.81 2008/01/03 17:48:13 bram + * in DBFCreate, use default code page LDID/87 (= 0x57, ANSI) + * instead of LDID/3. This seems to be the same as what ESRI + * would be doing by default. + * + * Revision 1.80 2007/12/30 14:36:39 fwarmerdam + * avoid syntax issue with last comment. + * + * Revision 1.79 2007/12/30 14:35:48 fwarmerdam + * Avoid char* / unsigned char* warnings. + * + * Revision 1.78 2007/12/18 18:28:07 bram + * - create hook for client specific atof (bugzilla ticket 1615) + * - check for NULL handle before closing cpCPG file, and close after reading. + * + * Revision 1.77 2007/12/15 20:25:21 bram + * dbfopen.c now reads the Code Page information from the DBF file, and exports + * this information as a string through the DBFGetCodePage function. This is + * either the number from the LDID header field ("LDID/") or as the + * content of an accompanying .CPG file. When creating a DBF file, the code can + * be set using DBFCreateEx. + * + * Revision 1.76 2007/12/12 22:21:32 bram + * DBFClose: check for NULL psDBF handle before trying to close it. + * + * Revision 1.75 2007/12/06 13:58:19 fwarmerdam + * make sure file offset calculations are done in as SAOffset + * + * Revision 1.74 2007/12/06 07:00:25 fwarmerdam + * dbfopen now using SAHooks for fileio + * + * Revision 1.73 2007/09/03 19:48:11 fwarmerdam + * move DBFReadAttribute() static dDoubleField into dbfinfo + * + * Revision 1.72 2007/09/03 19:34:06 fwarmerdam + * Avoid use of static tuple buffer in DBFReadTuple() + * + * Revision 1.71 2006/06/22 14:37:18 fwarmerdam + * avoid memory leak if dbfopen fread fails + * + * Revision 1.70 2006/06/17 17:47:05 fwarmerdam + * use calloc() for dbfinfo in DBFCreate + * + * Revision 1.69 2006/06/17 15:34:32 fwarmerdam + * disallow creating fields wider than 255 + * + * Revision 1.68 2006/06/17 15:12:40 fwarmerdam + * Fixed C++ style comments. + * + * Revision 1.67 2006/06/17 00:24:53 fwarmerdam + * Don't treat non-zero decimals values as high order byte for length + * for strings. It causes serious corruption for some files. + * http://bugzilla.remotesensing.org/show_bug.cgi?id=1202 + * + * Revision 1.66 2006/03/29 18:26:20 fwarmerdam + * fixed bug with size of pachfieldtype in dbfcloneempty + * + * Revision 1.65 2006/02/15 01:14:30 fwarmerdam + * added DBFAddNativeFieldType + * + * Revision 1.64 2006/02/09 00:29:04 fwarmerdam + * Changed to put spaces into string fields that are NULL as + * per http://bugzilla.maptools.org/show_bug.cgi?id=316. + * + * Revision 1.63 2006/01/25 15:35:43 fwarmerdam + * check success on DBFFlushRecord + * + * Revision 1.62 2006/01/10 16:28:03 fwarmerdam + * Fixed typo in CPLError. + * + * Revision 1.61 2006/01/10 16:26:29 fwarmerdam + * Push loading record buffer into DBFLoadRecord. + * Implement CPL error reporting if USE_CPL defined. + * + * Revision 1.60 2006/01/05 01:27:27 fwarmerdam + * added dbf deletion mark/fetch + * + * Revision 1.59 2005/03/14 15:20:28 fwarmerdam + * Fixed last change. + * + * Revision 1.58 2005/03/14 15:18:54 fwarmerdam + * Treat very wide fields with no decimals as double. This is + * more than 32bit integer fields. + * + * Revision 1.57 2005/02/10 20:16:54 fwarmerdam + * Make the pszStringField buffer for DBFReadAttribute() static char [256] + * as per bug 306. + * + * Revision 1.56 2005/02/10 20:07:56 fwarmerdam + * Fixed bug 305 in DBFCloneEmpty() - header length problem. + * + * Revision 1.55 2004/09/26 20:23:46 fwarmerdam + * avoid warnings with rcsid and signed/unsigned stuff + * + * Revision 1.54 2004/09/15 16:26:10 fwarmerdam + * Treat all blank numeric fields as null too. + */ + +#include "shapefil.h" + +#include +#include +#include +#include + +#ifdef USE_CPL +#include "cpl_string.h" +#else + +#if defined(_MSC_VER) +# if _MSC_VER < 1900 +# define snprintf _snprintf +# endif +#elif defined(WIN32) || defined(_WIN32) +# ifndef snprintf +# define snprintf _snprintf +# endif +#endif + +#define CPLsprintf sprintf +#define CPLsnprintf snprintf +#endif + +SHP_CVSID("$Id: dbfopen.c 37046 2016-12-31 09:59:57Z rouault $") + +#ifndef FALSE +# define FALSE 0 +# define TRUE 1 +#endif + +/* File header size */ +#define XBASE_FILEHDR_SZ 32 + +#define HEADER_RECORD_TERMINATOR 0x0D + +/* See http://www.manmrk.net/tutorials/database/xbase/dbf.html */ +#define END_OF_FILE_CHARACTER 0x1A + +#ifdef USE_CPL +CPL_INLINE static void CPL_IGNORE_RET_VAL_INT(CPL_UNUSED int unused) {} +#else +#define CPL_IGNORE_RET_VAL_INT(x) x +#endif + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ + +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + +/************************************************************************/ +/* DBFWriteHeader() */ +/* */ +/* This is called to write out the file header, and field */ +/* descriptions before writing any actual data records. This */ +/* also computes all the DBFDataSet field offset/size/decimals */ +/* and so forth values. */ +/************************************************************************/ + +static void DBFWriteHeader(DBFHandle psDBF) + +{ + unsigned char abyHeader[XBASE_FILEHDR_SZ] = { 0 }; + + if( !psDBF->bNoHeader ) + return; + + psDBF->bNoHeader = FALSE; + +/* -------------------------------------------------------------------- */ +/* Initialize the file header information. */ +/* -------------------------------------------------------------------- */ + abyHeader[0] = 0x03; /* memo field? - just copying */ + + /* write out update date */ + abyHeader[1] = (unsigned char) psDBF->nUpdateYearSince1900; + abyHeader[2] = (unsigned char) psDBF->nUpdateMonth; + abyHeader[3] = (unsigned char) psDBF->nUpdateDay; + + /* record count preset at zero */ + + abyHeader[8] = (unsigned char) (psDBF->nHeaderLength % 256); + abyHeader[9] = (unsigned char) (psDBF->nHeaderLength / 256); + + abyHeader[10] = (unsigned char) (psDBF->nRecordLength % 256); + abyHeader[11] = (unsigned char) (psDBF->nRecordLength / 256); + + abyHeader[29] = (unsigned char) (psDBF->iLanguageDriver); + +/* -------------------------------------------------------------------- */ +/* Write the initial 32 byte file header, and all the field */ +/* descriptions. */ +/* -------------------------------------------------------------------- */ + psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); + psDBF->sHooks.FWrite( abyHeader, XBASE_FILEHDR_SZ, 1, psDBF->fp ); + psDBF->sHooks.FWrite( psDBF->pszHeader, XBASE_FLDHDR_SZ, psDBF->nFields, + psDBF->fp ); + +/* -------------------------------------------------------------------- */ +/* Write out the newline character if there is room for it. */ +/* -------------------------------------------------------------------- */ + if( psDBF->nHeaderLength > XBASE_FLDHDR_SZ*psDBF->nFields + + XBASE_FLDHDR_SZ ) + { + char cNewline; + + cNewline = HEADER_RECORD_TERMINATOR; + psDBF->sHooks.FWrite( &cNewline, 1, 1, psDBF->fp ); + } + +/* -------------------------------------------------------------------- */ +/* If the file is new, add a EOF character. */ +/* -------------------------------------------------------------------- */ + if( psDBF->nRecords == 0 && psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } +} + +/************************************************************************/ +/* DBFFlushRecord() */ +/* */ +/* Write out the current record if there is one. */ +/************************************************************************/ + +static int DBFFlushRecord( DBFHandle psDBF ) + +{ + SAOffset nRecordOffset; + + if( psDBF->bCurrentRecordModified && psDBF->nCurrentRecord > -1 ) + { + psDBF->bCurrentRecordModified = FALSE; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) psDBF->nCurrentRecord + + psDBF->nHeaderLength; + + if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ) != 0 + || psDBF->sHooks.FWrite( psDBF->pszCurrentRecord, + psDBF->nRecordLength, + 1, psDBF->fp ) != 1 ) + { + char szMessage[128]; + snprintf( szMessage, sizeof(szMessage), "Failure writing DBF record %d.", + psDBF->nCurrentRecord ); + psDBF->sHooks.Error( szMessage ); + return FALSE; + } + + if( psDBF->nCurrentRecord == psDBF->nRecords - 1 ) + { + if( psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } + } + } + + return TRUE; +} + +/************************************************************************/ +/* DBFLoadRecord() */ +/************************************************************************/ + +static int DBFLoadRecord( DBFHandle psDBF, int iRecord ) + +{ + if( psDBF->nCurrentRecord != iRecord ) + { + SAOffset nRecordOffset; + + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, SEEK_SET ) != 0 ) + { + char szMessage[128]; + snprintf( szMessage, sizeof(szMessage), "fseek(%ld) failed on DBF file.", + (long) nRecordOffset ); + psDBF->sHooks.Error( szMessage ); + return FALSE; + } + + if( psDBF->sHooks.FRead( psDBF->pszCurrentRecord, + psDBF->nRecordLength, 1, psDBF->fp ) != 1 ) + { + char szMessage[128]; + snprintf( szMessage, sizeof(szMessage), "fread(%d) failed on DBF file.", + psDBF->nRecordLength ); + psDBF->sHooks.Error( szMessage ); + return FALSE; + } + + psDBF->nCurrentRecord = iRecord; + } + + return TRUE; +} + +/************************************************************************/ +/* DBFUpdateHeader() */ +/************************************************************************/ + +void SHPAPI_CALL +DBFUpdateHeader( DBFHandle psDBF ) + +{ + unsigned char abyFileHeader[XBASE_FILEHDR_SZ]; + + if( psDBF->bNoHeader ) + DBFWriteHeader( psDBF ); + + if( !DBFFlushRecord( psDBF ) ) + return; + + psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); + psDBF->sHooks.FRead( abyFileHeader, sizeof(abyFileHeader), 1, psDBF->fp ); + + abyFileHeader[1] = (unsigned char) psDBF->nUpdateYearSince1900; + abyFileHeader[2] = (unsigned char) psDBF->nUpdateMonth; + abyFileHeader[3] = (unsigned char) psDBF->nUpdateDay; + abyFileHeader[4] = (unsigned char) (psDBF->nRecords & 0xFF); + abyFileHeader[5] = (unsigned char) ((psDBF->nRecords>>8) & 0xFF); + abyFileHeader[6] = (unsigned char) ((psDBF->nRecords>>16) & 0xFF); + abyFileHeader[7] = (unsigned char) ((psDBF->nRecords>>24) & 0xFF); + + psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); + psDBF->sHooks.FWrite( abyFileHeader, sizeof(abyFileHeader), 1, psDBF->fp ); + + psDBF->sHooks.FFlush( psDBF->fp ); +} + +/************************************************************************/ +/* DBFSetLastModifiedDate() */ +/************************************************************************/ + +void SHPAPI_CALL +DBFSetLastModifiedDate( DBFHandle psDBF, int nYYSince1900, int nMM, int nDD ) +{ + psDBF->nUpdateYearSince1900 = nYYSince1900; + psDBF->nUpdateMonth = nMM; + psDBF->nUpdateDay = nDD; +} + +/************************************************************************/ +/* DBFOpen() */ +/* */ +/* Open a .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFOpen( const char * pszFilename, const char * pszAccess ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return DBFOpenLL( pszFilename, pszAccess, &sHooks ); +} + +/************************************************************************/ +/* DBFOpen() */ +/* */ +/* Open a .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFOpenLL( const char * pszFilename, const char * pszAccess, SAHooks *psHooks ) + +{ + DBFHandle psDBF; + SAFile pfCPG; + unsigned char *pabyBuf; + int nFields, nHeadLen, iField, i; + char *pszBasename, *pszFullname; + int nBufSize = 500; + size_t nFullnameLen; + +/* -------------------------------------------------------------------- */ +/* We only allow the access strings "rb" and "r+". */ +/* -------------------------------------------------------------------- */ + if( strcmp(pszAccess,"r") != 0 && strcmp(pszAccess,"r+") != 0 + && strcmp(pszAccess,"rb") != 0 && strcmp(pszAccess,"rb+") != 0 + && strcmp(pszAccess,"r+b") != 0 ) + return( NULL ); + + if( strcmp(pszAccess,"r") == 0 ) + pszAccess = "rb"; + + if( strcmp(pszAccess,"r+") == 0 ) + pszAccess = "rb+"; + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszFilename)+5); + strcpy( pszBasename, pszFilename ); + for( i = (int)strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + + nFullnameLen = strlen(pszBasename) + 5; + pszFullname = (char *) malloc(nFullnameLen); + snprintf( pszFullname, nFullnameLen, "%s.dbf", pszBasename ); + + psDBF = (DBFHandle) calloc( 1, sizeof(DBFInfo) ); + psDBF->fp = psHooks->FOpen( pszFullname, pszAccess ); + memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); + + if( psDBF->fp == NULL ) + { + snprintf( pszFullname, nFullnameLen, "%s.DBF", pszBasename ); + psDBF->fp = psDBF->sHooks.FOpen(pszFullname, pszAccess ); + } + + snprintf( pszFullname, nFullnameLen, "%s.cpg", pszBasename ); + pfCPG = psHooks->FOpen( pszFullname, "r" ); + if( pfCPG == NULL ) + { + snprintf( pszFullname, nFullnameLen, "%s.CPG", pszBasename ); + pfCPG = psHooks->FOpen( pszFullname, "r" ); + } + + free( pszBasename ); + free( pszFullname ); + + if( psDBF->fp == NULL ) + { + free( psDBF ); + if( pfCPG ) psHooks->FClose( pfCPG ); + return( NULL ); + } + + psDBF->bNoHeader = FALSE; + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + +/* -------------------------------------------------------------------- */ +/* Read Table Header info */ +/* -------------------------------------------------------------------- */ + pabyBuf = (unsigned char *) malloc(nBufSize); + if( psDBF->sHooks.FRead( pabyBuf, XBASE_FILEHDR_SZ, 1, psDBF->fp ) != 1 ) + { + psDBF->sHooks.FClose( psDBF->fp ); + if( pfCPG ) psDBF->sHooks.FClose( pfCPG ); + free( pabyBuf ); + free( psDBF ); + return NULL; + } + + DBFSetLastModifiedDate(psDBF, pabyBuf[1], pabyBuf[2], pabyBuf[3]); + + psDBF->nRecords = + pabyBuf[4]|(pabyBuf[5]<<8)|(pabyBuf[6]<<16)|((pabyBuf[7]&0x7f)<<24); + + psDBF->nHeaderLength = nHeadLen = pabyBuf[8]|(pabyBuf[9]<<8); + psDBF->nRecordLength = pabyBuf[10]|(pabyBuf[11]<<8); + psDBF->iLanguageDriver = pabyBuf[29]; + + if (psDBF->nRecordLength == 0 || nHeadLen < XBASE_FILEHDR_SZ) + { + psDBF->sHooks.FClose( psDBF->fp ); + if( pfCPG ) psDBF->sHooks.FClose( pfCPG ); + free( pabyBuf ); + free( psDBF ); + return NULL; + } + + psDBF->nFields = nFields = (nHeadLen - XBASE_FILEHDR_SZ) / XBASE_FLDHDR_SZ; + + /* coverity[tainted_data] */ + psDBF->pszCurrentRecord = (char *) malloc(psDBF->nRecordLength); + +/* -------------------------------------------------------------------- */ +/* Figure out the code page from the LDID and CPG */ +/* -------------------------------------------------------------------- */ + + psDBF->pszCodePage = NULL; + if( pfCPG ) + { + size_t n; + memset( pabyBuf, 0, nBufSize); + psDBF->sHooks.FRead( pabyBuf, nBufSize - 1, 1, pfCPG ); + n = strcspn( (char *) pabyBuf, "\n\r" ); + if( n > 0 ) + { + pabyBuf[n] = '\0'; + psDBF->pszCodePage = (char *) malloc(n + 1); + memcpy( psDBF->pszCodePage, pabyBuf, n + 1 ); + } + psDBF->sHooks.FClose( pfCPG ); + } + if( psDBF->pszCodePage == NULL && pabyBuf[29] != 0 ) + { + snprintf( (char *) pabyBuf, nBufSize, "LDID/%d", psDBF->iLanguageDriver ); + psDBF->pszCodePage = (char *) malloc(strlen((char*)pabyBuf) + 1); + strcpy( psDBF->pszCodePage, (char *) pabyBuf ); + } + +/* -------------------------------------------------------------------- */ +/* Read in Field Definitions */ +/* -------------------------------------------------------------------- */ + + pabyBuf = (unsigned char *) SfRealloc(pabyBuf,nHeadLen); + psDBF->pszHeader = (char *) pabyBuf; + + psDBF->sHooks.FSeek( psDBF->fp, XBASE_FILEHDR_SZ, 0 ); + if( psDBF->sHooks.FRead( pabyBuf, nHeadLen-XBASE_FILEHDR_SZ, 1, + psDBF->fp ) != 1 ) + { + psDBF->sHooks.FClose( psDBF->fp ); + free( pabyBuf ); + free( psDBF->pszCurrentRecord ); + free( psDBF ); + return NULL; + } + + psDBF->panFieldOffset = (int *) malloc(sizeof(int) * nFields); + psDBF->panFieldSize = (int *) malloc(sizeof(int) * nFields); + psDBF->panFieldDecimals = (int *) malloc(sizeof(int) * nFields); + psDBF->pachFieldType = (char *) malloc(sizeof(char) * nFields); + + for( iField = 0; iField < nFields; iField++ ) + { + unsigned char *pabyFInfo; + + pabyFInfo = pabyBuf+iField*XBASE_FLDHDR_SZ; + if( pabyFInfo[0] == HEADER_RECORD_TERMINATOR ) + { + psDBF->nFields = iField; + break; + } + + if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' ) + { + psDBF->panFieldSize[iField] = pabyFInfo[16]; + psDBF->panFieldDecimals[iField] = pabyFInfo[17]; + } + else + { + psDBF->panFieldSize[iField] = pabyFInfo[16]; + psDBF->panFieldDecimals[iField] = 0; + +/* +** The following seemed to be used sometimes to handle files with long +** string fields, but in other cases (such as bug 1202) the decimals field +** just seems to indicate some sort of preferred formatting, not very +** wide fields. So I have disabled this code. FrankW. + psDBF->panFieldSize[iField] = pabyFInfo[16] + pabyFInfo[17]*256; + psDBF->panFieldDecimals[iField] = 0; +*/ + } + + psDBF->pachFieldType[iField] = (char) pabyFInfo[11]; + if( iField == 0 ) + psDBF->panFieldOffset[iField] = 1; + else + psDBF->panFieldOffset[iField] = + psDBF->panFieldOffset[iField-1] + psDBF->panFieldSize[iField-1]; + } + + DBFSetWriteEndOfFileChar( psDBF, TRUE ); + + return( psDBF ); +} + +/************************************************************************/ +/* DBFClose() */ +/************************************************************************/ + +void SHPAPI_CALL +DBFClose(DBFHandle psDBF) +{ + if( psDBF == NULL ) + return; + +/* -------------------------------------------------------------------- */ +/* Write out header if not already written. */ +/* -------------------------------------------------------------------- */ + if( psDBF->bNoHeader ) + DBFWriteHeader( psDBF ); + + CPL_IGNORE_RET_VAL_INT(DBFFlushRecord( psDBF )); + +/* -------------------------------------------------------------------- */ +/* Update last access date, and number of records if we have */ +/* write access. */ +/* -------------------------------------------------------------------- */ + if( psDBF->bUpdated ) + DBFUpdateHeader( psDBF ); + +/* -------------------------------------------------------------------- */ +/* Close, and free resources. */ +/* -------------------------------------------------------------------- */ + psDBF->sHooks.FClose( psDBF->fp ); + + if( psDBF->panFieldOffset != NULL ) + { + free( psDBF->panFieldOffset ); + free( psDBF->panFieldSize ); + free( psDBF->panFieldDecimals ); + free( psDBF->pachFieldType ); + } + + if( psDBF->pszWorkField != NULL ) + free( psDBF->pszWorkField ); + + free( psDBF->pszHeader ); + free( psDBF->pszCurrentRecord ); + free( psDBF->pszCodePage ); + + free( psDBF ); +} + +/************************************************************************/ +/* DBFCreate() */ +/* */ +/* Create a new .dbf file with default code page LDID/87 (0x57) */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCreate( const char * pszFilename ) + +{ + return DBFCreateEx( pszFilename, "LDID/87" ); // 0x57 +} + +/************************************************************************/ +/* DBFCreateEx() */ +/* */ +/* Create a new .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCreateEx( const char * pszFilename, const char* pszCodePage ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return DBFCreateLL( pszFilename, pszCodePage , &sHooks ); +} + +/************************************************************************/ +/* DBFCreate() */ +/* */ +/* Create a new .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCreateLL( const char * pszFilename, const char * pszCodePage, SAHooks *psHooks ) + +{ + DBFHandle psDBF; + SAFile fp; + char *pszFullname, *pszBasename; + int i, ldid = -1; + char chZero = '\0'; + size_t nFullnameLen; + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszFilename)+5); + strcpy( pszBasename, pszFilename ); + for( i = (int)strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + + nFullnameLen = strlen(pszBasename) + 5; + pszFullname = (char *) malloc(nFullnameLen); + snprintf( pszFullname, nFullnameLen, "%s.dbf", pszBasename ); + +/* -------------------------------------------------------------------- */ +/* Create the file. */ +/* -------------------------------------------------------------------- */ + fp = psHooks->FOpen( pszFullname, "wb" ); + if( fp == NULL ) + { + free( pszBasename ); + free( pszFullname ); + return( NULL ); + } + + psHooks->FWrite( &chZero, 1, 1, fp ); + psHooks->FClose( fp ); + + fp = psHooks->FOpen( pszFullname, "rb+" ); + if( fp == NULL ) + { + free( pszBasename ); + free( pszFullname ); + return( NULL ); + } + + snprintf( pszFullname, nFullnameLen, "%s.cpg", pszBasename ); + if( pszCodePage != NULL ) + { + if( strncmp( pszCodePage, "LDID/", 5 ) == 0 ) + { + ldid = atoi( pszCodePage + 5 ); + if( ldid > 255 ) + ldid = -1; // don't use 0 to indicate out of range as LDID/0 is a valid one + } + if( ldid < 0 ) + { + SAFile fpCPG = psHooks->FOpen( pszFullname, "w" ); + psHooks->FWrite( (char*) pszCodePage, strlen(pszCodePage), 1, fpCPG ); + psHooks->FClose( fpCPG ); + } + } + if( pszCodePage == NULL || ldid >= 0 ) + { + psHooks->Remove( pszFullname ); + } + + free( pszBasename ); + free( pszFullname ); + +/* -------------------------------------------------------------------- */ +/* Create the info structure. */ +/* -------------------------------------------------------------------- */ + psDBF = (DBFHandle) calloc(1,sizeof(DBFInfo)); + + memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); + psDBF->fp = fp; + psDBF->nRecords = 0; + psDBF->nFields = 0; + psDBF->nRecordLength = 1; + psDBF->nHeaderLength = XBASE_FILEHDR_SZ + 1; /* + 1 for HEADER_RECORD_TERMINATOR */ + + psDBF->panFieldOffset = NULL; + psDBF->panFieldSize = NULL; + psDBF->panFieldDecimals = NULL; + psDBF->pachFieldType = NULL; + psDBF->pszHeader = NULL; + + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->pszCurrentRecord = NULL; + + psDBF->bNoHeader = TRUE; + + psDBF->iLanguageDriver = ldid > 0 ? ldid : 0; + psDBF->pszCodePage = NULL; + if( pszCodePage ) + { + psDBF->pszCodePage = (char * ) malloc( strlen(pszCodePage) + 1 ); + strcpy( psDBF->pszCodePage, pszCodePage ); + } + DBFSetLastModifiedDate(psDBF, 95, 7, 26); /* dummy date */ + + DBFSetWriteEndOfFileChar(psDBF, TRUE); + + return( psDBF ); +} + +/************************************************************************/ +/* DBFAddField() */ +/* */ +/* Add a field to a newly created .dbf or to an existing one */ +/************************************************************************/ + +int SHPAPI_CALL +DBFAddField(DBFHandle psDBF, const char * pszFieldName, + DBFFieldType eType, int nWidth, int nDecimals ) + +{ + char chNativeType = 'C'; + + if( eType == FTLogical ) + chNativeType = 'L'; + else if (eType == FTDate) + chNativeType = 'D'; + else if (eType == FTString) + chNativeType = 'C'; + else + chNativeType = 'N'; + + return DBFAddNativeFieldType( psDBF, pszFieldName, chNativeType, + nWidth, nDecimals ); +} + +/************************************************************************/ +/* DBFGetNullCharacter() */ +/************************************************************************/ + +static char DBFGetNullCharacter(char chType) +{ + switch (chType) + { + case 'N': + case 'F': + return '*'; + case 'D': + return '0'; + case 'L': + return '?'; + default: + return ' '; + } +} + +/************************************************************************/ +/* DBFAddField() */ +/* */ +/* Add a field to a newly created .dbf file before any records */ +/* are written. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFAddNativeFieldType(DBFHandle psDBF, const char * pszFieldName, + char chType, int nWidth, int nDecimals ) + +{ + char *pszFInfo; + int i; + int nOldRecordLength, nOldHeaderLength; + char *pszRecord; + char chFieldFill; + SAOffset nRecordOffset; + + /* make sure that everything is written in .dbf */ + if( !DBFFlushRecord( psDBF ) ) + return -1; + + if( psDBF->nHeaderLength + XBASE_FLDHDR_SZ > 65535 ) + { + char szMessage[128]; + snprintf( szMessage, sizeof(szMessage), + "Cannot add field %s. Header length limit reached " + "(max 65535 bytes, 2046 fields).", + pszFieldName ); + psDBF->sHooks.Error( szMessage ); + return -1; + } + +/* -------------------------------------------------------------------- */ +/* Do some checking to ensure we can add records to this file. */ +/* -------------------------------------------------------------------- */ + if( nWidth < 1 ) + return -1; + + if( nWidth > XBASE_FLD_MAX_WIDTH ) + nWidth = XBASE_FLD_MAX_WIDTH; + + if( psDBF->nRecordLength + nWidth > 65535 ) + { + char szMessage[128]; + snprintf( szMessage, sizeof(szMessage), + "Cannot add field %s. Record length limit reached " + "(max 65535 bytes).", + pszFieldName ); + psDBF->sHooks.Error( szMessage ); + return -1; + } + + nOldRecordLength = psDBF->nRecordLength; + nOldHeaderLength = psDBF->nHeaderLength; + +/* -------------------------------------------------------------------- */ +/* SfRealloc all the arrays larger to hold the additional field */ +/* information. */ +/* -------------------------------------------------------------------- */ + psDBF->nFields++; + + psDBF->panFieldOffset = (int *) + SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldSize = (int *) + SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldDecimals = (int *) + SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); + + psDBF->pachFieldType = (char *) + SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); + +/* -------------------------------------------------------------------- */ +/* Assign the new field information fields. */ +/* -------------------------------------------------------------------- */ + psDBF->panFieldOffset[psDBF->nFields-1] = psDBF->nRecordLength; + psDBF->nRecordLength += nWidth; + psDBF->panFieldSize[psDBF->nFields-1] = nWidth; + psDBF->panFieldDecimals[psDBF->nFields-1] = nDecimals; + psDBF->pachFieldType[psDBF->nFields-1] = chType; + +/* -------------------------------------------------------------------- */ +/* Extend the required header information. */ +/* -------------------------------------------------------------------- */ + psDBF->nHeaderLength += XBASE_FLDHDR_SZ; + psDBF->bUpdated = FALSE; + + psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader, + psDBF->nFields*XBASE_FLDHDR_SZ); + + pszFInfo = psDBF->pszHeader + XBASE_FLDHDR_SZ * (psDBF->nFields-1); + + for( i = 0; i < XBASE_FLDHDR_SZ; i++ ) + pszFInfo[i] = '\0'; + + strncpy( pszFInfo, pszFieldName, XBASE_FLDNAME_LEN_WRITE ); + + pszFInfo[11] = psDBF->pachFieldType[psDBF->nFields-1]; + + if( chType == 'C' ) + { + pszFInfo[16] = (unsigned char) (nWidth % 256); + pszFInfo[17] = (unsigned char) (nWidth / 256); + } + else + { + pszFInfo[16] = (unsigned char) nWidth; + pszFInfo[17] = (unsigned char) nDecimals; + } + +/* -------------------------------------------------------------------- */ +/* Make the current record buffer appropriately larger. */ +/* -------------------------------------------------------------------- */ + psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, + psDBF->nRecordLength); + + /* we're done if dealing with new .dbf */ + if( psDBF->bNoHeader ) + return( psDBF->nFields - 1 ); + +/* -------------------------------------------------------------------- */ +/* For existing .dbf file, shift records */ +/* -------------------------------------------------------------------- */ + + /* alloc record */ + pszRecord = (char *) malloc(sizeof(char) * psDBF->nRecordLength); + + chFieldFill = DBFGetNullCharacter(chType); + + for (i = psDBF->nRecords-1; i >= 0; --i) + { + nRecordOffset = nOldRecordLength * (SAOffset) i + nOldHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + + /* set new field's value to NULL */ + memset(pszRecord + nOldRecordLength, chFieldFill, nWidth); + + nRecordOffset = psDBF->nRecordLength * (SAOffset) i + psDBF->nHeaderLength; + + /* move record to the new place*/ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + } + + if( psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) psDBF->nRecords + psDBF->nHeaderLength; + + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } + + /* free record */ + free(pszRecord); + + /* force update of header with new header, record length and new field */ + psDBF->bNoHeader = TRUE; + DBFUpdateHeader( psDBF ); + + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->bUpdated = TRUE; + + return( psDBF->nFields-1 ); +} + +/************************************************************************/ +/* DBFReadAttribute() */ +/* */ +/* Read one of the attribute fields of a record. */ +/************************************************************************/ + +static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField, + char chReqType ) + +{ + unsigned char *pabyRec; + void *pReturnField = NULL; + +/* -------------------------------------------------------------------- */ +/* Verify selection. */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity >= psDBF->nRecords ) + return( NULL ); + + if( iField < 0 || iField >= psDBF->nFields ) + return( NULL ); + +/* -------------------------------------------------------------------- */ +/* Have we read the record? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return NULL; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + +/* -------------------------------------------------------------------- */ +/* Ensure we have room to extract the target field. */ +/* -------------------------------------------------------------------- */ + if( psDBF->panFieldSize[iField] >= psDBF->nWorkFieldLength ) + { + psDBF->nWorkFieldLength = psDBF->panFieldSize[iField] + 100; + if( psDBF->pszWorkField == NULL ) + psDBF->pszWorkField = (char *) malloc(psDBF->nWorkFieldLength); + else + psDBF->pszWorkField = (char *) realloc(psDBF->pszWorkField, + psDBF->nWorkFieldLength); + } + +/* -------------------------------------------------------------------- */ +/* Extract the requested field. */ +/* -------------------------------------------------------------------- */ + memcpy( psDBF->pszWorkField, + ((const char *) pabyRec) + psDBF->panFieldOffset[iField], + psDBF->panFieldSize[iField] ); + psDBF->pszWorkField[psDBF->panFieldSize[iField]] = '\0'; + + pReturnField = psDBF->pszWorkField; + +/* -------------------------------------------------------------------- */ +/* Decode the field. */ +/* -------------------------------------------------------------------- */ + if( chReqType == 'I' ) + { + psDBF->fieldValue.nIntField = atoi(psDBF->pszWorkField); + + pReturnField = &(psDBF->fieldValue.nIntField); + } + else if( chReqType == 'N' ) + { + psDBF->fieldValue.dfDoubleField = psDBF->sHooks.Atof(psDBF->pszWorkField); + + pReturnField = &(psDBF->fieldValue.dfDoubleField); + } + +/* -------------------------------------------------------------------- */ +/* Should we trim white space off the string attribute value? */ +/* -------------------------------------------------------------------- */ +#ifdef TRIM_DBF_WHITESPACE + else + { + char *pchSrc, *pchDst; + + pchDst = pchSrc = psDBF->pszWorkField; + while( *pchSrc == ' ' ) + pchSrc++; + + while( *pchSrc != '\0' ) + *(pchDst++) = *(pchSrc++); + *pchDst = '\0'; + + while( pchDst != psDBF->pszWorkField && *(--pchDst) == ' ' ) + *pchDst = '\0'; + } +#endif + + return( pReturnField ); +} + +/************************************************************************/ +/* DBFReadIntAttribute() */ +/* */ +/* Read an integer attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + int *pnValue; + + pnValue = (int *) DBFReadAttribute( psDBF, iRecord, iField, 'I' ); + + if( pnValue == NULL ) + return 0; + else + return( *pnValue ); +} + +/************************************************************************/ +/* DBFReadDoubleAttribute() */ +/* */ +/* Read a double attribute. */ +/************************************************************************/ + +double SHPAPI_CALL +DBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + double *pdValue; + + pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); + + if( pdValue == NULL ) + return 0.0; + else + return( *pdValue ); +} + +/************************************************************************/ +/* DBFReadStringAttribute() */ +/* */ +/* Read a string attribute. */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'C' ) ); +} + +/************************************************************************/ +/* DBFReadLogicalAttribute() */ +/* */ +/* Read a logical attribute. */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFReadLogicalAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'L' ) ); +} + + +/************************************************************************/ +/* DBFIsValueNULL() */ +/* */ +/* Return TRUE if the passed string is NULL. */ +/************************************************************************/ + +static int DBFIsValueNULL( char chType, const char* pszValue ) +{ + int i; + + if( pszValue == NULL ) + return TRUE; + + switch(chType) + { + case 'N': + case 'F': + /* + ** We accept all asterisks or all blanks as NULL + ** though according to the spec I think it should be all + ** asterisks. + */ + if( pszValue[0] == '*' ) + return TRUE; + + for( i = 0; pszValue[i] != '\0'; i++ ) + { + if( pszValue[i] != ' ' ) + return FALSE; + } + return TRUE; + + case 'D': + /* NULL date fields have value "00000000" */ + return strncmp(pszValue,"00000000",8) == 0; + + case 'L': + /* NULL boolean fields have value "?" */ + return pszValue[0] == '?'; + + default: + /* empty string fields are considered NULL */ + return strlen(pszValue) == 0; + } +} + +/************************************************************************/ +/* DBFIsAttributeNULL() */ +/* */ +/* Return TRUE if value for field is NULL. */ +/* */ +/* Contributed by Jim Matthews. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFIsAttributeNULL( DBFHandle psDBF, int iRecord, int iField ) + +{ + const char *pszValue; + + pszValue = DBFReadStringAttribute( psDBF, iRecord, iField ); + + if( pszValue == NULL ) + return TRUE; + + return DBFIsValueNULL( psDBF->pachFieldType[iField], pszValue ); +} + +/************************************************************************/ +/* DBFGetFieldCount() */ +/* */ +/* Return the number of fields in this table. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFGetFieldCount( DBFHandle psDBF ) + +{ + return( psDBF->nFields ); +} + +/************************************************************************/ +/* DBFGetRecordCount() */ +/* */ +/* Return the number of records in this table. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFGetRecordCount( DBFHandle psDBF ) + +{ + return( psDBF->nRecords ); +} + +/************************************************************************/ +/* DBFGetFieldInfo() */ +/* */ +/* Return any requested information about the field. */ +/* pszFieldName must be at least XBASE_FLDNAME_LEN_READ+1 (=12) */ +/* bytes long. */ +/************************************************************************/ + +DBFFieldType SHPAPI_CALL +DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, + int * pnWidth, int * pnDecimals ) + +{ + if( iField < 0 || iField >= psDBF->nFields ) + return( FTInvalid ); + + if( pnWidth != NULL ) + *pnWidth = psDBF->panFieldSize[iField]; + + if( pnDecimals != NULL ) + *pnDecimals = psDBF->panFieldDecimals[iField]; + + if( pszFieldName != NULL ) + { + int i; + + strncpy( pszFieldName, (char *) psDBF->pszHeader+iField*XBASE_FLDHDR_SZ, + XBASE_FLDNAME_LEN_READ ); + pszFieldName[XBASE_FLDNAME_LEN_READ] = '\0'; + for( i = XBASE_FLDNAME_LEN_READ - 1; i > 0 && pszFieldName[i] == ' '; i-- ) + pszFieldName[i] = '\0'; + } + + if ( psDBF->pachFieldType[iField] == 'L' ) + return( FTLogical); + + else if (psDBF->pachFieldType[iField] == 'D') + return(FTDate); + + else if (psDBF->pachFieldType[iField] == 'N' + || psDBF->pachFieldType[iField] == 'F' ) + { + if( psDBF->panFieldDecimals[iField] > 0 + || psDBF->panFieldSize[iField] >= 10 ) + return( FTDouble ); + else + return( FTInteger ); + } + else + { + return( FTString ); + } +} + +/************************************************************************/ +/* DBFWriteAttribute() */ +/* */ +/* Write an attribute record to the file. */ +/************************************************************************/ + +static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField, + void * pValue ) + +{ + int i, j, nRetResult = TRUE; + unsigned char *pabyRec; + char szSField[XBASE_FLD_MAX_WIDTH+1], szFormat[20]; + +/* -------------------------------------------------------------------- */ +/* Is this a valid record? */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity > psDBF->nRecords ) + return( FALSE ); + + if( psDBF->bNoHeader ) + DBFWriteHeader(psDBF); + +/* -------------------------------------------------------------------- */ +/* Is this a brand new record? */ +/* -------------------------------------------------------------------- */ + if( hEntity == psDBF->nRecords ) + { + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + psDBF->nRecords++; + for( i = 0; i < psDBF->nRecordLength; i++ ) + psDBF->pszCurrentRecord[i] = ' '; + + psDBF->nCurrentRecord = hEntity; + } + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return FALSE; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + +/* -------------------------------------------------------------------- */ +/* Translate NULL value to valid DBF file representation. */ +/* */ +/* Contributed by Jim Matthews. */ +/* -------------------------------------------------------------------- */ + if( pValue == NULL ) + { + memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), + DBFGetNullCharacter(psDBF->pachFieldType[iField]), + psDBF->panFieldSize[iField] ); + return TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Assign all the record fields. */ +/* -------------------------------------------------------------------- */ + switch( psDBF->pachFieldType[iField] ) + { + case 'D': + case 'N': + case 'F': + { + int nWidth = psDBF->panFieldSize[iField]; + + if( (int) sizeof(szSField)-2 < nWidth ) + nWidth = sizeof(szSField)-2; + + snprintf( szFormat, sizeof(szFormat), "%%%d.%df", + nWidth, psDBF->panFieldDecimals[iField] ); + CPLsnprintf(szSField, sizeof(szSField), szFormat, *((double *) pValue) ); + szSField[sizeof(szSField)-1] = '\0'; + if( (int) strlen(szSField) > psDBF->panFieldSize[iField] ) + { + szSField[psDBF->panFieldSize[iField]] = '\0'; + nRetResult = FALSE; + } + strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), + szSField, strlen(szSField) ); + break; + } + + case 'L': + if (psDBF->panFieldSize[iField] >= 1 && + (*(char*)pValue == 'F' || *(char*)pValue == 'T')) + *(pabyRec+psDBF->panFieldOffset[iField]) = *(char*)pValue; + break; + + default: + if( (int) strlen((char *) pValue) > psDBF->panFieldSize[iField] ) + { + j = psDBF->panFieldSize[iField]; + nRetResult = FALSE; + } + else + { + memset( pabyRec+psDBF->panFieldOffset[iField], ' ', + psDBF->panFieldSize[iField] ); + j = (int)strlen((char *) pValue); + } + + strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), + (char *) pValue, j ); + break; + } + + return( nRetResult ); +} + +/************************************************************************/ +/* DBFWriteAttributeDirectly() */ +/* */ +/* Write an attribute record to the file, but without any */ +/* reformatting based on type. The provided buffer is written */ +/* as is to the field position in the record. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, + void * pValue ) + +{ + int i, j; + unsigned char *pabyRec; + +/* -------------------------------------------------------------------- */ +/* Is this a valid record? */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity > psDBF->nRecords ) + return( FALSE ); + + if( psDBF->bNoHeader ) + DBFWriteHeader(psDBF); + +/* -------------------------------------------------------------------- */ +/* Is this a brand new record? */ +/* -------------------------------------------------------------------- */ + if( hEntity == psDBF->nRecords ) + { + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + psDBF->nRecords++; + for( i = 0; i < psDBF->nRecordLength; i++ ) + psDBF->pszCurrentRecord[i] = ' '; + + psDBF->nCurrentRecord = hEntity; + } + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return FALSE; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + +/* -------------------------------------------------------------------- */ +/* Assign all the record fields. */ +/* -------------------------------------------------------------------- */ + if( (int)strlen((char *) pValue) > psDBF->panFieldSize[iField] ) + j = psDBF->panFieldSize[iField]; + else + { + memset( pabyRec+psDBF->panFieldOffset[iField], ' ', + psDBF->panFieldSize[iField] ); + j = (int)strlen((char *) pValue); + } + + strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), + (char *) pValue, j ); + + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + + return( TRUE ); +} + +/************************************************************************/ +/* DBFWriteDoubleAttribute() */ +/* */ +/* Write a double attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteDoubleAttribute( DBFHandle psDBF, int iRecord, int iField, + double dValue ) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); +} + +/************************************************************************/ +/* DBFWriteIntegerAttribute() */ +/* */ +/* Write a integer attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteIntegerAttribute( DBFHandle psDBF, int iRecord, int iField, + int nValue ) + +{ + double dValue = nValue; + + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); +} + +/************************************************************************/ +/* DBFWriteStringAttribute() */ +/* */ +/* Write a string attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteStringAttribute( DBFHandle psDBF, int iRecord, int iField, + const char * pszValue ) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) pszValue ) ); +} + +/************************************************************************/ +/* DBFWriteNULLAttribute() */ +/* */ +/* Write a string attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteNULLAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, NULL ) ); +} + +/************************************************************************/ +/* DBFWriteLogicalAttribute() */ +/* */ +/* Write a logical attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteLogicalAttribute( DBFHandle psDBF, int iRecord, int iField, + const char lValue) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) (&lValue) ) ); +} + +/************************************************************************/ +/* DBFWriteTuple() */ +/* */ +/* Write an attribute record to the file. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ) + +{ + int i; + unsigned char *pabyRec; + +/* -------------------------------------------------------------------- */ +/* Is this a valid record? */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity > psDBF->nRecords ) + return( FALSE ); + + if( psDBF->bNoHeader ) + DBFWriteHeader(psDBF); + +/* -------------------------------------------------------------------- */ +/* Is this a brand new record? */ +/* -------------------------------------------------------------------- */ + if( hEntity == psDBF->nRecords ) + { + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + psDBF->nRecords++; + for( i = 0; i < psDBF->nRecordLength; i++ ) + psDBF->pszCurrentRecord[i] = ' '; + + psDBF->nCurrentRecord = hEntity; + } + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return FALSE; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + + memcpy ( pabyRec, pRawTuple, psDBF->nRecordLength ); + + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + + return( TRUE ); +} + +/************************************************************************/ +/* DBFReadTuple() */ +/* */ +/* Read a complete record. Note that the result is only valid */ +/* till the next record read for any reason. */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFReadTuple(DBFHandle psDBF, int hEntity ) + +{ + if( hEntity < 0 || hEntity >= psDBF->nRecords ) + return( NULL ); + + if( !DBFLoadRecord( psDBF, hEntity ) ) + return NULL; + + return (const char *) psDBF->pszCurrentRecord; +} + +/************************************************************************/ +/* DBFCloneEmpty() */ +/* */ +/* Read one of the attribute fields of a record. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ) +{ + DBFHandle newDBF; + + newDBF = DBFCreateEx ( pszFilename, psDBF->pszCodePage ); + if ( newDBF == NULL ) return ( NULL ); + + newDBF->nFields = psDBF->nFields; + newDBF->nRecordLength = psDBF->nRecordLength; + newDBF->nHeaderLength = psDBF->nHeaderLength; + + if( psDBF->pszHeader ) + { + newDBF->pszHeader = (char *) malloc ( XBASE_FLDHDR_SZ * psDBF->nFields ); + memcpy ( newDBF->pszHeader, psDBF->pszHeader, XBASE_FLDHDR_SZ * psDBF->nFields ); + } + + newDBF->panFieldOffset = (int *) malloc ( sizeof(int) * psDBF->nFields ); + memcpy ( newDBF->panFieldOffset, psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); + newDBF->panFieldSize = (int *) malloc ( sizeof(int) * psDBF->nFields ); + memcpy ( newDBF->panFieldSize, psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); + newDBF->panFieldDecimals = (int *) malloc ( sizeof(int) * psDBF->nFields ); + memcpy ( newDBF->panFieldDecimals, psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); + newDBF->pachFieldType = (char *) malloc ( sizeof(char) * psDBF->nFields ); + memcpy ( newDBF->pachFieldType, psDBF->pachFieldType, sizeof(char)*psDBF->nFields ); + + newDBF->bNoHeader = TRUE; + newDBF->bUpdated = TRUE; + newDBF->bWriteEndOfFileChar = psDBF->bWriteEndOfFileChar; + + DBFWriteHeader ( newDBF ); + DBFClose ( newDBF ); + + newDBF = DBFOpen ( pszFilename, "rb+" ); + newDBF->bWriteEndOfFileChar = psDBF->bWriteEndOfFileChar; + + return ( newDBF ); +} + +/************************************************************************/ +/* DBFGetNativeFieldType() */ +/* */ +/* Return the DBase field type for the specified field. */ +/* */ +/* Value can be one of: 'C' (String), 'D' (Date), 'F' (Float), */ +/* 'N' (Numeric, with or without decimal), */ +/* 'L' (Logical), */ +/* 'M' (Memo: 10 digits .DBT block ptr) */ +/************************************************************************/ + +char SHPAPI_CALL +DBFGetNativeFieldType( DBFHandle psDBF, int iField ) + +{ + if( iField >=0 && iField < psDBF->nFields ) + return psDBF->pachFieldType[iField]; + + return ' '; +} + +/************************************************************************/ +/* str_to_upper() */ +/************************************************************************/ + +static void str_to_upper (char *string) +{ + int len; + int i = -1; + + len = (int)strlen (string); + + while (++i < len) + if (isalpha(string[i]) && islower(string[i])) + string[i] = (char) toupper ((int)string[i]); +} + +/************************************************************************/ +/* DBFGetFieldIndex() */ +/* */ +/* Get the index number for a field in a .dbf file. */ +/* */ +/* Contributed by Jim Matthews. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName) + +{ + char name[XBASE_FLDNAME_LEN_READ+1], + name1[XBASE_FLDNAME_LEN_READ+1], + name2[XBASE_FLDNAME_LEN_READ+1]; + int i; + + strncpy(name1, pszFieldName,XBASE_FLDNAME_LEN_READ); + name1[XBASE_FLDNAME_LEN_READ] = '\0'; + str_to_upper(name1); + + for( i = 0; i < DBFGetFieldCount(psDBF); i++ ) + { + DBFGetFieldInfo( psDBF, i, name, NULL, NULL ); + strncpy(name2,name,XBASE_FLDNAME_LEN_READ); + name2[XBASE_FLDNAME_LEN_READ] = '\0'; + str_to_upper(name2); + + if(!strcmp(name1,name2)) + return(i); + } + return(-1); +} + +/************************************************************************/ +/* DBFIsRecordDeleted() */ +/* */ +/* Returns TRUE if the indicated record is deleted, otherwise */ +/* it returns FALSE. */ +/************************************************************************/ + +int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ) + +{ +/* -------------------------------------------------------------------- */ +/* Verify selection. */ +/* -------------------------------------------------------------------- */ + if( iShape < 0 || iShape >= psDBF->nRecords ) + return TRUE; + +/* -------------------------------------------------------------------- */ +/* Have we read the record? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, iShape ) ) + return FALSE; + +/* -------------------------------------------------------------------- */ +/* '*' means deleted. */ +/* -------------------------------------------------------------------- */ + return psDBF->pszCurrentRecord[0] == '*'; +} + +/************************************************************************/ +/* DBFMarkRecordDeleted() */ +/************************************************************************/ + +int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, + int bIsDeleted ) + +{ + char chNewFlag; + +/* -------------------------------------------------------------------- */ +/* Verify selection. */ +/* -------------------------------------------------------------------- */ + if( iShape < 0 || iShape >= psDBF->nRecords ) + return FALSE; + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, iShape ) ) + return FALSE; + +/* -------------------------------------------------------------------- */ +/* Assign value, marking record as dirty if it changes. */ +/* -------------------------------------------------------------------- */ + if( bIsDeleted ) + chNewFlag = '*'; + else + chNewFlag = ' '; + + if( psDBF->pszCurrentRecord[0] != chNewFlag ) + { + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + psDBF->pszCurrentRecord[0] = chNewFlag; + } + + return TRUE; +} + +/************************************************************************/ +/* DBFGetCodePage */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFGetCodePage(DBFHandle psDBF ) +{ + if( psDBF == NULL ) + return NULL; + return psDBF->pszCodePage; +} + +/************************************************************************/ +/* DBFDeleteField() */ +/* */ +/* Remove a field from a .dbf file */ +/************************************************************************/ + +int SHPAPI_CALL +DBFDeleteField(DBFHandle psDBF, int iField) +{ + int nOldRecordLength, nOldHeaderLength; + int nDeletedFieldOffset, nDeletedFieldSize; + SAOffset nRecordOffset; + char* pszRecord; + int i, iRecord; + + if (iField < 0 || iField >= psDBF->nFields) + return FALSE; + + /* make sure that everything is written in .dbf */ + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + /* get information about field to be deleted */ + nOldRecordLength = psDBF->nRecordLength; + nOldHeaderLength = psDBF->nHeaderLength; + nDeletedFieldOffset = psDBF->panFieldOffset[iField]; + nDeletedFieldSize = psDBF->panFieldSize[iField]; + + /* update fields info */ + for (i = iField + 1; i < psDBF->nFields; i++) + { + psDBF->panFieldOffset[i-1] = psDBF->panFieldOffset[i] - nDeletedFieldSize; + psDBF->panFieldSize[i-1] = psDBF->panFieldSize[i]; + psDBF->panFieldDecimals[i-1] = psDBF->panFieldDecimals[i]; + psDBF->pachFieldType[i-1] = psDBF->pachFieldType[i]; + } + + /* resize fields arrays */ + psDBF->nFields--; + + psDBF->panFieldOffset = (int *) + SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldSize = (int *) + SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldDecimals = (int *) + SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); + + psDBF->pachFieldType = (char *) + SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); + + /* update header information */ + psDBF->nHeaderLength -= XBASE_FLDHDR_SZ; + psDBF->nRecordLength -= nDeletedFieldSize; + + /* overwrite field information in header */ + memmove(psDBF->pszHeader + iField*XBASE_FLDHDR_SZ, + psDBF->pszHeader + (iField+1)*XBASE_FLDHDR_SZ, + sizeof(char) * (psDBF->nFields - iField)*XBASE_FLDHDR_SZ); + + psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader, + psDBF->nFields*XBASE_FLDHDR_SZ); + + /* update size of current record appropriately */ + psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, + psDBF->nRecordLength); + + /* we're done if we're dealing with not yet created .dbf */ + if ( psDBF->bNoHeader && psDBF->nRecords == 0 ) + return TRUE; + + /* force update of header with new header and record length */ + psDBF->bNoHeader = TRUE; + DBFUpdateHeader( psDBF ); + + /* alloc record */ + pszRecord = (char *) malloc(sizeof(char) * nOldRecordLength); + + /* shift records to their new positions */ + for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) + { + nRecordOffset = + nOldRecordLength * (SAOffset) iRecord + nOldHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* move record in two steps */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecord, nDeletedFieldOffset, 1, psDBF->fp ); + psDBF->sHooks.FWrite( pszRecord + nDeletedFieldOffset + nDeletedFieldSize, + nOldRecordLength - nDeletedFieldOffset - nDeletedFieldSize, + 1, psDBF->fp ); + + } + + if( psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } + + /* TODO: truncate file */ + + /* free record */ + free(pszRecord); + + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->bUpdated = TRUE; + + return TRUE; +} + +/************************************************************************/ +/* DBFReorderFields() */ +/* */ +/* Reorder the fields of a .dbf file */ +/* */ +/* panMap must be exactly psDBF->nFields long and be a permutation */ +/* of [0, psDBF->nFields-1]. This assumption will not be asserted in the*/ +/* code of DBFReorderFields. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFReorderFields( DBFHandle psDBF, int* panMap ) +{ + SAOffset nRecordOffset; + int i, iRecord; + int *panFieldOffsetNew; + int *panFieldSizeNew; + int *panFieldDecimalsNew; + char *pachFieldTypeNew; + char *pszHeaderNew; + char *pszRecord; + char *pszRecordNew; + + if ( psDBF->nFields == 0 ) + return TRUE; + + /* make sure that everything is written in .dbf */ + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + /* a simple malloc() would be enough, but calloc() helps clang static analyzer */ + panFieldOffsetNew = (int *) calloc(sizeof(int), psDBF->nFields); + panFieldSizeNew = (int *) calloc(sizeof(int), psDBF->nFields); + panFieldDecimalsNew = (int *) calloc(sizeof(int), psDBF->nFields); + pachFieldTypeNew = (char *) calloc(sizeof(char), psDBF->nFields); + pszHeaderNew = (char*) malloc(sizeof(char) * XBASE_FLDHDR_SZ * + psDBF->nFields); + + /* shuffle fields definitions */ + for(i=0; i < psDBF->nFields; i++) + { + panFieldSizeNew[i] = psDBF->panFieldSize[panMap[i]]; + panFieldDecimalsNew[i] = psDBF->panFieldDecimals[panMap[i]]; + pachFieldTypeNew[i] = psDBF->pachFieldType[panMap[i]]; + memcpy(pszHeaderNew + i * XBASE_FLDHDR_SZ, + psDBF->pszHeader + panMap[i] * XBASE_FLDHDR_SZ, XBASE_FLDHDR_SZ); + } + panFieldOffsetNew[0] = 1; + for(i=1; i < psDBF->nFields; i++) + { + panFieldOffsetNew[i] = panFieldOffsetNew[i - 1] + panFieldSizeNew[i - 1]; + } + + free(psDBF->pszHeader); + psDBF->pszHeader = pszHeaderNew; + + /* we're done if we're dealing with not yet created .dbf */ + if ( !(psDBF->bNoHeader && psDBF->nRecords == 0) ) + { + /* force update of header with new header and record length */ + psDBF->bNoHeader = TRUE; + DBFUpdateHeader( psDBF ); + + /* alloc record */ + pszRecord = (char *) malloc(sizeof(char) * psDBF->nRecordLength); + pszRecordNew = (char *) malloc(sizeof(char) * psDBF->nRecordLength); + + /* shuffle fields in records */ + for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) + { + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + + pszRecordNew[0] = pszRecord[0]; + + for(i=0; i < psDBF->nFields; i++) + { + memcpy(pszRecordNew + panFieldOffsetNew[i], + pszRecord + psDBF->panFieldOffset[panMap[i]], + psDBF->panFieldSize[panMap[i]]); + } + + /* write record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecordNew, psDBF->nRecordLength, 1, psDBF->fp ); + } + + /* free record */ + free(pszRecord); + free(pszRecordNew); + } + + free(psDBF->panFieldOffset); + free(psDBF->panFieldSize); + free(psDBF->panFieldDecimals); + free(psDBF->pachFieldType); + + psDBF->panFieldOffset = panFieldOffsetNew; + psDBF->panFieldSize = panFieldSizeNew; + psDBF->panFieldDecimals =panFieldDecimalsNew; + psDBF->pachFieldType = pachFieldTypeNew; + + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->bUpdated = TRUE; + + return TRUE; +} + + +/************************************************************************/ +/* DBFAlterFieldDefn() */ +/* */ +/* Alter a field definition in a .dbf file */ +/************************************************************************/ + +int SHPAPI_CALL +DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName, + char chType, int nWidth, int nDecimals ) +{ + int i; + int iRecord; + int nOffset; + int nOldWidth; + int nOldRecordLength; + SAOffset nRecordOffset; + char* pszFInfo; + char chOldType; + int bIsNULL; + char chFieldFill; + + if (iField < 0 || iField >= psDBF->nFields) + return FALSE; + + /* make sure that everything is written in .dbf */ + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + chFieldFill = DBFGetNullCharacter(chType); + + chOldType = psDBF->pachFieldType[iField]; + nOffset = psDBF->panFieldOffset[iField]; + nOldWidth = psDBF->panFieldSize[iField]; + nOldRecordLength = psDBF->nRecordLength; + +/* -------------------------------------------------------------------- */ +/* Do some checking to ensure we can add records to this file. */ +/* -------------------------------------------------------------------- */ + if( nWidth < 1 ) + return -1; + + if( nWidth > XBASE_FLD_MAX_WIDTH ) + nWidth = XBASE_FLD_MAX_WIDTH; + +/* -------------------------------------------------------------------- */ +/* Assign the new field information fields. */ +/* -------------------------------------------------------------------- */ + psDBF->panFieldSize[iField] = nWidth; + psDBF->panFieldDecimals[iField] = nDecimals; + psDBF->pachFieldType[iField] = chType; + +/* -------------------------------------------------------------------- */ +/* Update the header information. */ +/* -------------------------------------------------------------------- */ + pszFInfo = psDBF->pszHeader + XBASE_FLDHDR_SZ * iField; + + for( i = 0; i < XBASE_FLDHDR_SZ; i++ ) + pszFInfo[i] = '\0'; + + strncpy( pszFInfo, pszFieldName, XBASE_FLDNAME_LEN_WRITE ); + + pszFInfo[11] = psDBF->pachFieldType[iField]; + + if( chType == 'C' ) + { + pszFInfo[16] = (unsigned char) (nWidth % 256); + pszFInfo[17] = (unsigned char) (nWidth / 256); + } + else + { + pszFInfo[16] = (unsigned char) nWidth; + pszFInfo[17] = (unsigned char) nDecimals; + } + +/* -------------------------------------------------------------------- */ +/* Update offsets */ +/* -------------------------------------------------------------------- */ + if (nWidth != nOldWidth) + { + for (i = iField + 1; i < psDBF->nFields; i++) + psDBF->panFieldOffset[i] += nWidth - nOldWidth; + psDBF->nRecordLength += nWidth - nOldWidth; + + psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, + psDBF->nRecordLength); + } + + /* we're done if we're dealing with not yet created .dbf */ + if ( psDBF->bNoHeader && psDBF->nRecords == 0 ) + return TRUE; + + /* force update of header with new header and record length */ + psDBF->bNoHeader = TRUE; + DBFUpdateHeader( psDBF ); + + if (nWidth < nOldWidth || (nWidth == nOldWidth && chType != chOldType)) + { + char* pszRecord = (char *) malloc(sizeof(char) * nOldRecordLength); + char* pszOldField = (char *) malloc(sizeof(char) * (nOldWidth + 1)); + + /* cppcheck-suppress uninitdata */ + pszOldField[nOldWidth] = 0; + + /* move records to their new positions */ + for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) + { + nRecordOffset = + nOldRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + + memcpy(pszOldField, pszRecord + nOffset, nOldWidth); + bIsNULL = DBFIsValueNULL( chOldType, pszOldField ); + + if (nWidth != nOldWidth) + { + if ((chOldType == 'N' || chOldType == 'F' || chOldType == 'D') && pszOldField[0] == ' ') + { + /* Strip leading spaces when truncating a numeric field */ + memmove( pszRecord + nOffset, + pszRecord + nOffset + nOldWidth - nWidth, + nWidth ); + } + if (nOffset + nOldWidth < nOldRecordLength) + { + memmove( pszRecord + nOffset + nWidth, + pszRecord + nOffset + nOldWidth, + nOldRecordLength - (nOffset + nOldWidth)); + } + } + + /* Convert null value to the appropriate value of the new type */ + if (bIsNULL) + { + memset( pszRecord + nOffset, chFieldFill, nWidth); + } + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* write record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + } + + if( psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) psDBF->nRecords + psDBF->nHeaderLength; + + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } + /* TODO: truncate file */ + + free(pszRecord); + free(pszOldField); + } + else if (nWidth > nOldWidth) + { + char* pszRecord = (char *) malloc(sizeof(char) * psDBF->nRecordLength); + char* pszOldField = (char *) malloc(sizeof(char) * (nOldWidth + 1)); + + /* cppcheck-suppress uninitdata */ + pszOldField[nOldWidth] = 0; + + /* move records to their new positions */ + for (iRecord = psDBF->nRecords - 1; iRecord >= 0; iRecord--) + { + nRecordOffset = + nOldRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + + memcpy(pszOldField, pszRecord + nOffset, nOldWidth); + bIsNULL = DBFIsValueNULL( chOldType, pszOldField ); + + if (nOffset + nOldWidth < nOldRecordLength) + { + memmove( pszRecord + nOffset + nWidth, + pszRecord + nOffset + nOldWidth, + nOldRecordLength - (nOffset + nOldWidth)); + } + + /* Convert null value to the appropriate value of the new type */ + if (bIsNULL) + { + memset( pszRecord + nOffset, chFieldFill, nWidth); + } + else + { + if ((chOldType == 'N' || chOldType == 'F')) + { + /* Add leading spaces when expanding a numeric field */ + memmove( pszRecord + nOffset + nWidth - nOldWidth, + pszRecord + nOffset, nOldWidth ); + memset( pszRecord + nOffset, ' ', nWidth - nOldWidth ); + } + else + { + /* Add trailing spaces */ + memset(pszRecord + nOffset + nOldWidth, ' ', nWidth - nOldWidth); + } + } + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* write record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + } + + if( psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) psDBF->nRecords + psDBF->nHeaderLength; + + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } + + free(pszRecord); + free(pszOldField); + } + + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->bUpdated = TRUE; + + return TRUE; +} + +/************************************************************************/ +/* DBFSetWriteEndOfFileChar() */ +/************************************************************************/ + +void SHPAPI_CALL DBFSetWriteEndOfFileChar( DBFHandle psDBF, int bWriteFlag ) +{ + psDBF->bWriteEndOfFileChar = bWriteFlag; +} diff --git a/support/ShapeLib/depcomp b/support/ShapeLib/depcomp new file mode 100644 index 00000000..fc98710e --- /dev/null +++ b/support/ShapeLib/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2013-05-30.07; # UTC + +# Copyright (C) 1999-2014 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, see . + +# 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 outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +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" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# 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 + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +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 -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## 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). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - 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 -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # 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. +## 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. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -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 -ne 0; then + 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 ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # 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 + ;; + +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. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + 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. + set_dir_from "$object" + set_base_from "$object" + 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 -ne 0; then + 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,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_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. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool 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$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # 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 + ;; + +#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 "X$1" != 'X--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|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | 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 "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + 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. + -arch) + eat=yes ;; + -*|$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" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | 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 "X$1" != 'X--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. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # 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 + ;; + +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-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/support/ShapeLib/install-sh b/support/ShapeLib/install-sh new file mode 100644 index 00000000..59990a10 --- /dev/null +++ b/support/ShapeLib/install-sh @@ -0,0 +1,508 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2014-09-12.12; # UTC + +# 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. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +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: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -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. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; 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 "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + 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 + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 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 problematic for 'test' and other utilities. + 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 "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # 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 "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + dstdir=`dirname "$dst"` + 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. + ;; + *) + # $RANDOM is not portable (e.g. dash); use it when possible to + # lower collision chance + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # As "mkdir -p" follows symlinks and we work in /tmp possibly; so + # create the $tmpdir first (and fail if unsuccessful) to make sure + # that nobody tries to guess the $tmpdir name. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/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-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 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 + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && 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"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # 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. + { + test ! -f "$dst" || + $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 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || 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-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/support/ShapeLib/ltmain.sh b/support/ShapeLib/ltmain.sh new file mode 100644 index 00000000..147d758a --- /dev/null +++ b/support/ShapeLib/ltmain.sh @@ -0,0 +1,11156 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 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. + +# GNU Libtool 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. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.6 Debian-2.4.6-0.1" +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 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. + +# 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 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES 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, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do 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 + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >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 + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# 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 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 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. + +# 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 3 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, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --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 + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +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. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# 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= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE 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. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# 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 () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + 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 "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # 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. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # 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 + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # 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= + pie_flag= + + 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) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append 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,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append 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. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; 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 no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + 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 yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; 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." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/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." + + $opt_dry_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 + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/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." + + $opt_dry_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 + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [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: $progname [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 + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +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: $progname [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: $progname [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: $progname [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 following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [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 + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -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 + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -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 + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +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: $progname [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." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + 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 + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # 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 + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + 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" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + 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. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append 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 -e "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. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + 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 + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_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 + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append 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 + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_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 + func_basename "$file" + destfile=$func_basename_result + 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 + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "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) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # 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/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + 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*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + 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 "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# 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. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + 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 + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + 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_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + 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 + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_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've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# 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. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +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 +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# 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 variables: + generated_by_libtool_version='$macro_version' + 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 + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED '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 \"\$file\" | $SED '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 \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + 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 "\ + + # 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 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # 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 \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + 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 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#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 +# define FOPEN_WB "wb" +# 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 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +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]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + 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 = (size_t) (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 (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + 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 (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + 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 * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +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 (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + 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 + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append 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 dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; 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 + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + 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 + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + 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 + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + 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*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # 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-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # 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 + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append 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 dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; 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 + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + 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. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'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\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + 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 $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; 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 $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append 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 + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; 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 .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # 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 yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + 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 use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # 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 + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + 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. + func_append dlprefiles " $lib $dependency_libs" + else + func_append 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 + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && 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 + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; 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 prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + 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 + *"$absdir:"*) ;; + *) func_append 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 "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + 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 built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; 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 lib = "$linkmode" && + test yes = "$hardcode_into_libs"; 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 "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + 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* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + 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 prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; 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 (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; 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 + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; 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 yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; 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 + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; 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 prog = "$linkmode"; 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 unsupported != "$hardcode_direct"; 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 yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; 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 cannot 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 yes = "$module"; 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 no = "$build_old_libs"; 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 lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + 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 "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # 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 "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=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 "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # 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 + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; 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 + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # 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=$1 + number_minor=$2 + number_revision=$3 + # + # 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 + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type '$version_type'" + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + 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]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + 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]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + 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]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + 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 + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + 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 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + 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 no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; 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 | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "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 + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; 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 "*) ;; + *) func_append 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 "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-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 yes = "$build_libtool_need_lc"; then + func_append 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. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + 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 "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append 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 + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append 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 + func_append 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 + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; 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 + ;; + esac + ;; + 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 with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; 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 no = "$build_old_libs"; 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 no = "$allow_undefined"; 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 no = "$build_old_libs"; 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 + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + 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 " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append 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 yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append 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 "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append 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 relink = "$opt_mode" || 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 + shift + realname=$1 + 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 + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "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" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && 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 : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # 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 + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + 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~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "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 + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + 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\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && 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 + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( 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 relink = "$opt_mode"; then + $opt_dry_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 + func_show_eval '${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 + func_show_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 yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_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= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${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" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + 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 "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append 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 "*) ;; + *) func_append 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append 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 yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + 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 + func_append 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 + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; 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 "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "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}\" || $lt_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 + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + 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 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # 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 + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$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 + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$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= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "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}\" || $lt_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 + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; 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 "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; 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) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# 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' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_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 no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + 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) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + 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 $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where 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 +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/support/ShapeLib/m4/libtool.m4 b/support/ShapeLib/m4/libtool.m4 new file mode 100644 index 00000000..10ab2844 --- /dev/null +++ b/support/ShapeLib/m4/libtool.m4 @@ -0,0 +1,8388 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# 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. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 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. + +# GNU Libtool 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 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool 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, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +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 set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +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 delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# 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 + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_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 set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # 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" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])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_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$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. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$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 -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_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$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed '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$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# 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. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode + # options accordingly. + 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 what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; 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* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + 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-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + 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-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + 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_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + 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*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # 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:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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 yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$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 "$_lt_linker_boilerplate" | $SED '/^$/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 -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# 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* | cegcc*) + # 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; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + 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; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # 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 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + 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 + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + 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` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # 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`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + 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` + fi + ;; + 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 +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#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 + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 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; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_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_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; 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* | cegcc*) + 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 + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + 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=-ldld], + [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=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && 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_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 yes = "$lt_cv_dlopen_self"; 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_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 +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$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:$LINENO: $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:$LINENO: \$? = $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 "$_lt_compiler_boilerplate" | $SED '/^$/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_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 .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; 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 no = "$hard_links"; 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 +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_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 +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +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" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # 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. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +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" +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 + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + 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' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; 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 + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # 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' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # 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' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + 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=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $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' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + 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* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + 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~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + 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' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + 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 + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + 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 + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # 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' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # 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$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`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + ;; + +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[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + 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 + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + 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=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + 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 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + 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' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + 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 + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # 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 + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # 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 + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;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' + ;; + +netbsdelf*-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='NetBSD ld.elf_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 # correct to gnu/linux during the next big refactor + 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=qnx + 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='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + 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 + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + 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~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +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 + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + 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 # correct to gnu/linux during the next big refactor + 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=sco + 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 + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + 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' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[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]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_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="m4_if([$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 <<_LT_EOF 1>&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 + +_LT_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 +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_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 + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; 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 yes = "$with_gnu_ld"; 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 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[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 +# that 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 +aix[[4-9]]*) + 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', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | 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 + ;; + +haiku*) + 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])(-bit)?( [LM]SB)? 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 + ;; + +interix[[3-9]]*) + # 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 glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + 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=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + 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 + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +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 + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (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 + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + 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 + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-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_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# 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]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + 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 + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# 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 + +# Try without a prefix underscore, 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. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $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 <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_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_globsym_save_LIBS + CFLAGS=$lt_globsym_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 -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; 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 + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # 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). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # 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_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_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 + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # 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). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_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_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_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_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_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_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # 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). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # 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_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # 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). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_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_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_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_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # 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. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # 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 yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; 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_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_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_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[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 + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, 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 install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_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, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_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_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_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' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$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' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_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 '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_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~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $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_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&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. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_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_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** 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 + ;; + *) + # 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. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_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_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_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_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_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_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; 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 + : + else + # We have old collect2 + _LT_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_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_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_SYS_MODULE_PATH_AIX([$1]) + _LT_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_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # 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. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # 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_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_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' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_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_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $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_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_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_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_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 no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_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_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_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' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_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 -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_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 CANNOT 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_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_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_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$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_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +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_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + 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 yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_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_CFLAGS=$CFLAGS + 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++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_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 yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_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_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_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_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 -v "^Configured with:" | $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_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; 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 + : + else + # We have old collect2 + _LT_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_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_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_SYS_MODULE_PATH_AIX([$1]) + _LT_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_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # 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_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_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, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_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_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_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 "x$output_objdir/$soname" = "x$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) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_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_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_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; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $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_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_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_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_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_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-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_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + 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_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_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; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_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_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # 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_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_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_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_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_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_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' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_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=`func_echo_all "$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; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_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 -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_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::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_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_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | 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_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_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_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=`func_echo_all "$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; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_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" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_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 -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_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_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -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 -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_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 $wl-h $wl$soname -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 -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_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 CANNOT 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_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$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_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + 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 +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([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. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +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... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); 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 + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev 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 "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $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 "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$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 no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_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_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + 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 yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_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_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + 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 yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_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_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_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_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# 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. +_LT_TAG_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_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# 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. # +############################################################ + +m4_defun([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 +IFS=$as_save_IFS +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 10 -lt "$lt_ac_count" && 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_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/support/ShapeLib/m4/ltoptions.m4 b/support/ShapeLib/m4/ltoptions.m4 new file mode 100644 index 00000000..94b08297 --- /dev/null +++ b/support/ShapeLib/m4/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# 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 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_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=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_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=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_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=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/support/ShapeLib/m4/ltsugar.m4 b/support/ShapeLib/m4/ltsugar.m4 new file mode 100644 index 00000000..48bc9344 --- /dev/null +++ b/support/ShapeLib/m4/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# 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 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/support/ShapeLib/m4/ltversion.m4 b/support/ShapeLib/m4/ltversion.m4 new file mode 100644 index 00000000..fa04b52a --- /dev/null +++ b/support/ShapeLib/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# 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. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/support/ShapeLib/m4/lt~obsolete.m4 b/support/ShapeLib/m4/lt~obsolete.m4 new file mode 100644 index 00000000..c6b26f88 --- /dev/null +++ b/support/ShapeLib/m4/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# 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 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/support/ShapeLib/makefile.vc b/support/ShapeLib/makefile.vc new file mode 100644 index 00000000..4619a53f --- /dev/null +++ b/support/ShapeLib/makefile.vc @@ -0,0 +1,90 @@ + +#CFLAGS = /DSHPAPI_CALL=__stdcall +# 4100: 'identifier' : unreferenced formal parameter +CFLAGS = /nologo /Ox /MD /W4 /wd4100 /D_CRT_SECURE_NO_DEPRECATE /DSHAPELIB_DLLEXPORT /Z7 + +IMPORT_LIB = shapelib_i.lib +STATIC_LIB = shapelib.lib +DLLNAME = shapelib.dll +LINK_LIB = $(IMPORT_LIB) + +OBJ = shpopen.obj dbfopen.obj shptree.obj safileio.obj sbnsearch.obj + +all: $(STATIC_LIB) $(DLLNAME) \ + shpcreate.exe shpadd.exe shpdump.exe shprewind.exe dbfcreate.exe \ + dbfadd.exe dbfdump.exe shptest.exe shptreedump.exe + +shpopen.obj: shpopen.c shapefil.h + $(CC) $(CFLAGS) -c shpopen.c + +shptree.obj: shptree.c shapefil.h + $(CC) $(CFLAGS) -c shptree.c + +dbfopen.obj: dbfopen.c shapefil.h + $(CC) $(CFLAGS) -c dbfopen.c + +safileio.obj: safileio.c shapefil.h + $(CC) $(CFLAGS) -c safileio.c + +sbnsearch.obj: sbnsearch.c shapefil.h + $(CC) $(CFLAGS) -c sbnsearch.c + +shpcreate.exe: shpcreate.c $(LINK_LIB) + $(CC) $(CFLAGS) shpcreate.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpadd.exe: shpadd.c $(LINK_LIB) + $(CC) $(CFLAGS) shpadd.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpdump.exe: shpdump.c $(LINK_LIB) + $(CC) $(CFLAGS) shpdump.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shprewind.exe: shprewind.c $(LINK_LIB) + $(CC) $(CFLAGS) shprewind.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +dbfcreate.exe: dbfcreate.c $(LINK_LIB) + $(CC) $(CFLAGS) dbfcreate.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +dbfadd.exe: dbfadd.c $(LINK_LIB) + $(CC) $(CFLAGS) dbfadd.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +dbfdump.exe: dbfdump.c $(LINK_LIB) + $(CC) $(CFLAGS) dbfdump.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shptest.exe: shptest.c $(LINK_LIB) + $(CC) $(CFLAGS) shptest.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shputils.exe: shputils.c $(LINK_LIB) + $(CC) $(CFLAGS) shputils.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shptreedump.exe: shptreedump.c $(LINK_LIB) + $(CC) $(CFLAGS) shptreedump.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpdiff.exe: shpdiff.c $(LINK_LIB) + $(CC) $(CFLAGS) shpdiff.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.dll + -del *.manifest + +$(STATIC_LIB): $(OBJ) + lib /nologo /out:$(STATIC_LIB) $(OBJ) + +$(IMPORT_LIB): $(DLLNAME) + +$(DLLNAME): $(OBJ) + link /nologo /dll /out:$(DLLNAME) /implib:$(IMPORT_LIB) $(OBJ) + if exist $(DLLNAME).manifest mt /nologo -manifest $(DLLNAME).manifest -outputresource:$(DLLNAME);2 diff --git a/support/ShapeLib/missing b/support/ShapeLib/missing new file mode 100644 index 00000000..f62bbae3 --- /dev/null +++ b/support/ShapeLib/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2013-10-28.13; # UTC + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Originally written 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, see . + +# 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 + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +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 + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/support/ShapeLib/readme.txt b/support/ShapeLib/readme.txt new file mode 100644 index 00000000..e3e3f328 --- /dev/null +++ b/support/ShapeLib/readme.txt @@ -0,0 +1,29 @@ +======================================================================== + STATIC LIBRARY : ShapeLib Project Overview +======================================================================== + +AppWizard has created this ShapeLib library project for you. + +No source files were created as part of your project. + + +ShapeLib.vcxproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +ShapeLib.vcxproj.filters + This is the filters file for VC++ projects generated using an Application Wizard. + It contains information about the association between the files in your project + and the filters. This association is used in the IDE to show grouping of files with + similar extensions under a specific node (for e.g. ".cpp" files are associated with the + "Source Files" filter). + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" comments to indicate parts of the source code you +should add to or customize. + +///////////////////////////////////////////////////////////////////////////// diff --git a/support/ShapeLib/safileio.c b/support/ShapeLib/safileio.c new file mode 100644 index 00000000..533e7ada --- /dev/null +++ b/support/ShapeLib/safileio.c @@ -0,0 +1,291 @@ +/****************************************************************************** + * $Id: safileio.c,v 1.5 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Default implementation of file io based on stdio. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 2007, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: safileio.c,v $ + * Revision 1.5 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.4 2008-01-16 20:05:14 bram + * Add file hooks that accept UTF-8 encoded filenames on some platforms. Use SASetupUtf8Hooks + * tosetup the hooks and check SHPAPI_UTF8_HOOKS for its availability. Currently, this + * is only available on the Windows platform that decodes the UTF-8 filenames to wide + * character strings and feeds them to _wfopen and _wremove. + * + * Revision 1.3 2007/12/18 18:28:11 bram + * - create hook for client specific atof (bugzilla ticket 1615) + * - check for NULL handle before closing cpCPG file, and close after reading. + * + * Revision 1.2 2007/12/15 20:25:30 bram + * dbfopen.c now reads the Code Page information from the DBF file, and exports + * this information as a string through the DBFGetCodePage function. This is + * either the number from the LDID header field ("LDID/") or as the + * content of an accompanying .CPG file. When creating a DBF file, the code can + * be set using DBFCreateEx. + * + * Revision 1.1 2007/12/06 06:56:41 fwarmerdam + * new + * + */ + +#include "shapefil.h" + +#include +#include +#include +#include +#include +#include + +SHP_CVSID("$Id: safileio.c,v 1.5 2016-12-05 12:44:05 erouault Exp $"); + +#ifdef SHPAPI_UTF8_HOOKS +# ifdef SHPAPI_WINDOWS +# define WIN32_LEAN_AND_MEAN +# define NOMINMAX +# include +# pragma comment(lib, "kernel32.lib") +# endif +#endif + +/************************************************************************/ +/* SADFOpen() */ +/************************************************************************/ + +SAFile SADFOpen( const char *pszFilename, const char *pszAccess ) + +{ + return (SAFile) fopen( pszFilename, pszAccess ); +} + +/************************************************************************/ +/* SADFRead() */ +/************************************************************************/ + +SAOffset SADFRead( void *p, SAOffset size, SAOffset nmemb, SAFile file ) + +{ + return (SAOffset) fread( p, (size_t) size, (size_t) nmemb, + (FILE *) file ); +} + +/************************************************************************/ +/* SADFWrite() */ +/************************************************************************/ + +SAOffset SADFWrite( void *p, SAOffset size, SAOffset nmemb, SAFile file ) + +{ + return (SAOffset) fwrite( p, (size_t) size, (size_t) nmemb, + (FILE *) file ); +} + +/************************************************************************/ +/* SADFSeek() */ +/************************************************************************/ + +SAOffset SADFSeek( SAFile file, SAOffset offset, int whence ) + +{ + return (SAOffset) fseek( (FILE *) file, (long) offset, whence ); +} + +/************************************************************************/ +/* SADFTell() */ +/************************************************************************/ + +SAOffset SADFTell( SAFile file ) + +{ + return (SAOffset) ftell( (FILE *) file ); +} + +/************************************************************************/ +/* SADFFlush() */ +/************************************************************************/ + +int SADFFlush( SAFile file ) + +{ + return fflush( (FILE *) file ); +} + +/************************************************************************/ +/* SADFClose() */ +/************************************************************************/ + +int SADFClose( SAFile file ) + +{ + return fclose( (FILE *) file ); +} + +/************************************************************************/ +/* SADFClose() */ +/************************************************************************/ + +int SADRemove( const char *filename ) + +{ + return remove( filename ); +} + +/************************************************************************/ +/* SADError() */ +/************************************************************************/ + +void SADError( const char *message ) + +{ + fprintf( stderr, "%s\n", message ); +} + +/************************************************************************/ +/* SASetupDefaultHooks() */ +/************************************************************************/ + +void SASetupDefaultHooks( SAHooks *psHooks ) + +{ + psHooks->FOpen = SADFOpen; + psHooks->FRead = SADFRead; + psHooks->FWrite = SADFWrite; + psHooks->FSeek = SADFSeek; + psHooks->FTell = SADFTell; + psHooks->FFlush = SADFFlush; + psHooks->FClose = SADFClose; + psHooks->Remove = SADRemove; + + psHooks->Error = SADError; + psHooks->Atof = atof; +} + + + + +#ifdef SHPAPI_WINDOWS + +/************************************************************************/ +/* Utf8ToWideChar */ +/************************************************************************/ + +const wchar_t* Utf8ToWideChar( const char *pszFilename ) +{ + int nMulti, nWide; + wchar_t *pwszFileName; + + nMulti = strlen(pszFilename) + 1; + nWide = MultiByteToWideChar( CP_UTF8, 0, pszFilename, nMulti, 0, 0); + if( nWide == 0 ) + { + return NULL; + } + pwszFileName = (wchar_t*) malloc(nWide * sizeof(wchar_t)); + if ( pwszFileName == NULL ) + { + return NULL; + } + if( MultiByteToWideChar( CP_UTF8, 0, pszFilename, nMulti, pwszFileName, nWide ) == 0 ) + { + free( pwszFileName ); + return NULL; + } + return pwszFileName; +} + +/************************************************************************/ +/* SAUtf8WFOpen */ +/************************************************************************/ + +SAFile SAUtf8WFOpen( const char *pszFilename, const char *pszAccess ) +{ + SAFile file = NULL; + const wchar_t *pwszFileName, *pwszAccess; + pwszFileName = Utf8ToWideChar( pszFilename ); + pwszAccess = Utf8ToWideChar( pszAccess ); + if( pwszFileName != NULL && pwszFileName != NULL) + { + file = (SAFile) _wfopen( pwszFileName, pwszAccess ); + } + free ((wchar_t*) pwszFileName); + free ((wchar_t*) pwszAccess); + return file; +} + +/************************************************************************/ +/* SAUtf8WRemove() */ +/************************************************************************/ + +int SAUtf8WRemove( const char *pszFilename ) +{ + const wchar_t *pwszFileName = Utf8ToWideChar( pszFilename ); + int rc = -1; + if( pwszFileName != NULL ) + { + rc = _wremove( pwszFileName ); + } + free ((wchar_t*) pwszFileName); + return rc; +} + +#endif + +#ifdef SHPAPI_UTF8_HOOKS + +/************************************************************************/ +/* SASetupUtf8Hooks() */ +/************************************************************************/ + +void SASetupUtf8Hooks( SAHooks *psHooks ) +{ +#ifdef SHPAPI_WINDOWS + psHooks->FOpen = SAUtf8WFOpen; + psHooks->Remove = SAUtf8WRemove; +#else +# error "no implementations of UTF-8 hooks available for this platform" +#endif + psHooks->FRead = SADFRead; + psHooks->FWrite = SADFWrite; + psHooks->FSeek = SADFSeek; + psHooks->FTell = SADFTell; + psHooks->FFlush = SADFFlush; + psHooks->FClose = SADFClose; + + psHooks->Error = SADError; + psHooks->Atof = atof; +} + +#endif diff --git a/support/ShapeLib/sbnsearch.c b/support/ShapeLib/sbnsearch.c new file mode 100644 index 00000000..acc975b5 --- /dev/null +++ b/support/ShapeLib/sbnsearch.c @@ -0,0 +1,985 @@ +/****************************************************************************** + * $Id: sbnsearch.c,v 1.2 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Implementation of search in ESRI SBN spatial index. + * Author: Even Rouault, even dot rouault at mines dash paris dot org + * + ****************************************************************************** + * Copyright (c) 2012-2014, Even Rouault + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ******************************************************************************/ + +#include "shapefil.h" + +#include +#include +#include +#include + +SHP_CVSID("$Id: sbnsearch.c,v 1.2 2016-12-05 12:44:05 erouault Exp $") + +#ifndef TRUE +# define TRUE 1 +# define FALSE 0 +#endif + +#ifndef USE_CPL +#if defined(_MSC_VER) +# if _MSC_VER < 1900 +# define snprintf _snprintf +# endif +#elif defined(WIN32) || defined(_WIN32) +# ifndef snprintf +# define snprintf _snprintf +# endif +#endif +#endif + +#define READ_MSB_INT(ptr) \ + (((ptr)[0] << 24) | ((ptr)[1] << 16) | ((ptr)[2] << 8) | (ptr)[3]) + +#define CACHED_DEPTH_LIMIT 8 + +typedef unsigned char uchar; + +typedef int coord; +/*typedef uchar coord;*/ + +typedef struct +{ + uchar *pabyShapeDesc; /* Cache of (nShapeCount * 8) bytes of the bins. May be NULL. */ + int nBinStart; /* Index of first bin for this node. */ + int nShapeCount; /* Number of shapes attached to this node. */ + int nBinCount; /* Number of bins for this node. May be 0 if node is empty. */ + int nBinOffset; /* Offset in file of the start of the first bin. May be 0 if node is empty. */ + + int bBBoxInit; /* TRUE if the following bounding box has been computed. */ + coord bMinX; /* Bounding box of the shapes directly attached to this node. */ + coord bMinY; /* This is *not* the theoretical footprint of the node. */ + coord bMaxX; + coord bMaxY; +} SBNNodeDescriptor; + +struct SBNSearchInfo +{ + SAHooks sHooks; + SAFile fpSBN; + SBNNodeDescriptor *pasNodeDescriptor; + int nShapeCount; /* Total number of shapes */ + int nMaxDepth; /* Tree depth */ + double dfMinX; /* Bounding box of all shapes */ + double dfMaxX; + double dfMinY; + double dfMaxY; + +#ifdef DEBUG_IO + int nTotalBytesRead; +#endif +}; + +typedef struct +{ + SBNSearchHandle hSBN; + + coord bMinX; /* Search bounding box */ + coord bMinY; + coord bMaxX; + coord bMaxY; + + int nShapeCount; + int nShapeAlloc; + int *panShapeId; /* 0 based */ + + uchar abyBinShape[8 * 100]; + +#ifdef DEBUG_IO + int nBytesRead; +#endif +} SearchStruct; + +/************************************************************************/ +/* SwapWord() */ +/* */ +/* Swap a 2, 4 or 8 byte word. */ +/************************************************************************/ + +static void SwapWord( int length, void * wordP ) + +{ + int i; + uchar temp; + + for( i=0; i < length/2; i++ ) + { + temp = ((uchar *) wordP)[i]; + ((uchar *)wordP)[i] = ((uchar *) wordP)[length-i-1]; + ((uchar *) wordP)[length-i-1] = temp; + } +} + +/************************************************************************/ +/* SBNOpenDiskTree() */ +/************************************************************************/ + +SBNSearchHandle SBNOpenDiskTree( const char* pszSBNFilename, + SAHooks *psHooks ) +{ + int i; + SBNSearchHandle hSBN; + uchar abyHeader[108]; + int nShapeCount; + int nMaxDepth; + int nMaxNodes; + int nNodeDescSize; + int nNodeDescCount; + uchar* pabyData = NULL; + SBNNodeDescriptor* pasNodeDescriptor = NULL; + uchar abyBinHeader[8]; + int nCurNode; + int nNextNonEmptyNode; + int nExpectedBinId; + int bBigEndian; + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this machine. */ +/* -------------------------------------------------------------------- */ + i = 1; + if( *((unsigned char *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; + +/* -------------------------------------------------------------------- */ +/* Initialize the handle structure. */ +/* -------------------------------------------------------------------- */ + hSBN = (SBNSearchHandle) + calloc(sizeof(struct SBNSearchInfo),1); + + if (psHooks == NULL) + SASetupDefaultHooks( &(hSBN->sHooks) ); + else + memcpy( &(hSBN->sHooks), psHooks, sizeof(SAHooks) ); + + hSBN->fpSBN = hSBN->sHooks.FOpen(pszSBNFilename, "rb"); + if (hSBN->fpSBN == NULL) + { + free(hSBN); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Check file header signature. */ +/* -------------------------------------------------------------------- */ + if (hSBN->sHooks.FRead(abyHeader, 108, 1, hSBN->fpSBN) != 1 || + abyHeader[0] != 0 || + abyHeader[1] != 0 || + abyHeader[2] != 0x27 || + (abyHeader[3] != 0x0A && abyHeader[3] != 0x0D) || + abyHeader[4] != 0xFF || + abyHeader[5] != 0xFF || + abyHeader[6] != 0xFE || + abyHeader[7] != 0x70) + { + hSBN->sHooks.Error( ".sbn file is unreadable, or corrupt." ); + SBNCloseDiskTree(hSBN); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Read shapes bounding box. */ +/* -------------------------------------------------------------------- */ + + memcpy(&hSBN->dfMinX, abyHeader + 32, 8); + memcpy(&hSBN->dfMinY, abyHeader + 40, 8); + memcpy(&hSBN->dfMaxX, abyHeader + 48, 8); + memcpy(&hSBN->dfMaxY, abyHeader + 56, 8); + + if( !bBigEndian ) + { + SwapWord(8, &hSBN->dfMinX); + SwapWord(8, &hSBN->dfMinY); + SwapWord(8, &hSBN->dfMaxX); + SwapWord(8, &hSBN->dfMaxY); + } + + if( hSBN->dfMinX > hSBN->dfMaxX || + hSBN->dfMinY > hSBN->dfMaxY ) + { + hSBN->sHooks.Error( "Invalid extent in .sbn file." ); + SBNCloseDiskTree(hSBN); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Read and check number of shapes. */ +/* -------------------------------------------------------------------- */ + nShapeCount = READ_MSB_INT(abyHeader + 28); + hSBN->nShapeCount = nShapeCount; + if (nShapeCount < 0 || nShapeCount > 256000000 ) + { + char szErrorMsg[64]; + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Invalid shape count in .sbn : %d", nShapeCount ); + hSBN->sHooks.Error( szErrorMsg ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + /* Empty spatial index */ + if( nShapeCount == 0 ) + { + return hSBN; + } + +/* -------------------------------------------------------------------- */ +/* Compute tree depth. */ +/* It is computed such as in average there are not more than 8 */ +/* shapes per node. With a minimum depth of 2, and a maximum of 24 */ +/* -------------------------------------------------------------------- */ + nMaxDepth = 2; + while( nMaxDepth < 24 && nShapeCount > ((1 << nMaxDepth) - 1) * 8 ) + nMaxDepth ++; + hSBN->nMaxDepth = nMaxDepth; + nMaxNodes = (1 << nMaxDepth) - 1; + +/* -------------------------------------------------------------------- */ +/* Check that the first bin id is 1. */ +/* -------------------------------------------------------------------- */ + + if( READ_MSB_INT(abyHeader + 100) != 1 ) + { + hSBN->sHooks.Error( "Unexpected bin id" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Read and check number of node descriptors to be read. */ +/* There are at most (2^nMaxDepth) - 1, but all are not necessary */ +/* described. Non described nodes are empty. */ +/* -------------------------------------------------------------------- */ + nNodeDescSize = READ_MSB_INT(abyHeader + 104); + nNodeDescSize *= 2; /* 16-bit words */ + + /* each bin descriptor is made of 2 ints */ + nNodeDescCount = nNodeDescSize / 8; + + if ((nNodeDescSize % 8) != 0 || + nNodeDescCount < 0 || nNodeDescCount > nMaxNodes ) + { + char szErrorMsg[64]; + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Invalid node descriptor size in .sbn : %d", nNodeDescSize ); + hSBN->sHooks.Error( szErrorMsg ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + /* coverity[tainted_data] */ + pabyData = (uchar*) malloc( nNodeDescSize ); + pasNodeDescriptor = (SBNNodeDescriptor*) + calloc ( nMaxNodes, sizeof(SBNNodeDescriptor) ); + if (pabyData == NULL || pasNodeDescriptor == NULL) + { + free(pabyData); + free(pasNodeDescriptor); + hSBN->sHooks.Error( "Out of memory error" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Read node descriptors. */ +/* -------------------------------------------------------------------- */ + if (hSBN->sHooks.FRead(pabyData, nNodeDescSize, 1, + hSBN->fpSBN) != 1) + { + free(pabyData); + free(pasNodeDescriptor); + hSBN->sHooks.Error( "Cannot read node descriptors" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + hSBN->pasNodeDescriptor = pasNodeDescriptor; + + for(i = 0; i < nNodeDescCount; i++) + { +/* -------------------------------------------------------------------- */ +/* Each node descriptor contains the index of the first bin that */ +/* described it, and the number of shapes in this first bin and */ +/* the following bins (in the relevant case). */ +/* -------------------------------------------------------------------- */ + int nBinStart = READ_MSB_INT(pabyData + 8 * i); + int nNodeShapeCount = READ_MSB_INT(pabyData + 8 * i + 4); + pasNodeDescriptor[i].nBinStart = nBinStart > 0 ? nBinStart : 0; + pasNodeDescriptor[i].nShapeCount = nNodeShapeCount; + + if ((nBinStart > 0 && nNodeShapeCount == 0) || + nNodeShapeCount < 0 || nNodeShapeCount > nShapeCount) + { + hSBN->sHooks.Error( "Inconsistent shape count in bin" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + } + + free(pabyData); + pabyData = NULL; + + /* Locate first non-empty node */ + nCurNode = 0; + while(nCurNode < nMaxNodes && pasNodeDescriptor[nCurNode].nBinStart <= 0) + nCurNode ++; + + if( nCurNode >= nMaxNodes) + { + hSBN->sHooks.Error( "All nodes are empty" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + pasNodeDescriptor[nCurNode].nBinOffset = + (int) hSBN->sHooks.FTell(hSBN->fpSBN); + + /* Compute the index of the next non empty node. */ + nNextNonEmptyNode = nCurNode + 1; + while(nNextNonEmptyNode < nMaxNodes && + pasNodeDescriptor[nNextNonEmptyNode].nBinStart <= 0) + nNextNonEmptyNode ++; + + nExpectedBinId = 1; + +/* -------------------------------------------------------------------- */ +/* Traverse bins to compute the offset of the first bin of each */ +/* node. */ +/* Note: we could use the .sbx file to compute the offsets instead.*/ +/* -------------------------------------------------------------------- */ + while( hSBN->sHooks.FRead(abyBinHeader, 8, 1, + hSBN->fpSBN) == 1 ) + { + int nBinId; + int nBinSize; + + nExpectedBinId ++; + + nBinId = READ_MSB_INT(abyBinHeader); + nBinSize = READ_MSB_INT(abyBinHeader + 4); + nBinSize *= 2; /* 16-bit words */ + + if( nBinId != nExpectedBinId ) + { + hSBN->sHooks.Error( "Unexpected bin id" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + /* Bins are always limited to 100 features */ + /* If there are more, then they are located in continuous bins */ + if( (nBinSize % 8) != 0 || nBinSize <= 0 || nBinSize > 100 * 8) + { + hSBN->sHooks.Error( "Unexpected bin size" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + if( nNextNonEmptyNode < nMaxNodes && + nBinId == pasNodeDescriptor[nNextNonEmptyNode].nBinStart ) + { + nCurNode = nNextNonEmptyNode; + pasNodeDescriptor[nCurNode].nBinOffset = + (int) hSBN->sHooks.FTell(hSBN->fpSBN) - 8; + + /* Compute the index of the next non empty node. */ + nNextNonEmptyNode = nCurNode + 1; + while(nNextNonEmptyNode < nMaxNodes && + pasNodeDescriptor[nNextNonEmptyNode].nBinStart <= 0) + nNextNonEmptyNode ++; + } + + pasNodeDescriptor[nCurNode].nBinCount ++; + + /* Skip shape description */ + hSBN->sHooks.FSeek(hSBN->fpSBN, nBinSize, SEEK_CUR); + } + + return hSBN; +} + +/***********************************************************************/ +/* SBNCloseDiskTree() */ +/************************************************************************/ + +void SBNCloseDiskTree( SBNSearchHandle hSBN ) +{ + int i; + int nMaxNodes; + + if (hSBN == NULL) + return; + + if( hSBN->pasNodeDescriptor != NULL ) + { + nMaxNodes = (1 << hSBN->nMaxDepth) - 1; + for(i = 0; i < nMaxNodes; i++) + { + if( hSBN->pasNodeDescriptor[i].pabyShapeDesc != NULL ) + free(hSBN->pasNodeDescriptor[i].pabyShapeDesc); + } + } + + /* printf("hSBN->nTotalBytesRead = %d\n", hSBN->nTotalBytesRead); */ + + hSBN->sHooks.FClose(hSBN->fpSBN); + free(hSBN->pasNodeDescriptor); + free(hSBN); +} + + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ + +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + +/************************************************************************/ +/* SBNAddShapeId() */ +/************************************************************************/ + +static int SBNAddShapeId( SearchStruct* psSearch, + int nShapeId ) +{ + if (psSearch->nShapeCount == psSearch->nShapeAlloc) + { + int* pNewPtr; + + psSearch->nShapeAlloc = + (int) (((psSearch->nShapeCount + 100) * 5) / 4); + pNewPtr = + (int *) SfRealloc( psSearch->panShapeId, + psSearch->nShapeAlloc * sizeof(int) ); + if( pNewPtr == NULL ) + { + psSearch->hSBN->sHooks.Error( "Out of memory error" ); + return FALSE; + } + psSearch->panShapeId = pNewPtr; + } + + psSearch->panShapeId[psSearch->nShapeCount] = nShapeId; + psSearch->nShapeCount ++; + return TRUE; +} + +/************************************************************************/ +/* SBNSearchDiskInternal() */ +/************************************************************************/ + +/* Due to the way integer coordinates are rounded, */ +/* we can use a strict intersection test, except when the node */ +/* bounding box or the search bounding box is degenerated. */ +#define SEARCH_BB_INTERSECTS(_bMinX, _bMinY, _bMaxX, _bMaxY) \ + (((bSearchMinX < _bMaxX && bSearchMaxX > _bMinX) || \ + ((_bMinX == _bMaxX || bSearchMinX == bSearchMaxX) && \ + bSearchMinX <= _bMaxX && bSearchMaxX >= _bMinX)) && \ + ((bSearchMinY < _bMaxY && bSearchMaxY > _bMinY) || \ + ((_bMinY == _bMaxY || bSearchMinY == bSearchMaxY ) && \ + bSearchMinY <= _bMaxY && bSearchMaxY >= _bMinY))) + + +static int SBNSearchDiskInternal( SearchStruct* psSearch, + int nDepth, + int nNodeId, + coord bNodeMinX, + coord bNodeMinY, + coord bNodeMaxX, + coord bNodeMaxY ) +{ + SBNSearchHandle hSBN; + SBNNodeDescriptor* psNode; + coord bSearchMinX = psSearch->bMinX; + coord bSearchMinY = psSearch->bMinY; + coord bSearchMaxX = psSearch->bMaxX; + coord bSearchMaxY = psSearch->bMaxY; + + hSBN = psSearch->hSBN; + + psNode = &(hSBN->pasNodeDescriptor[nNodeId]); + +/* -------------------------------------------------------------------- */ +/* Check if this node contains shapes that intersect the search */ +/* bounding box. */ +/* -------------------------------------------------------------------- */ + if ( psNode->bBBoxInit && + !(SEARCH_BB_INTERSECTS(psNode->bMinX, psNode->bMinY, + psNode->bMaxX, psNode->bMaxY)) ) + + { + /* No intersection, then don't try to read the shapes attached */ + /* to this node */ + } + +/* -------------------------------------------------------------------- */ +/* If this node contains shapes that are cached, then read them. */ +/* -------------------------------------------------------------------- */ + else if (psNode->pabyShapeDesc != NULL) + { + int j; + uchar* pabyShapeDesc = psNode->pabyShapeDesc; + + /* printf("nNodeId = %d, nDepth = %d\n", nNodeId, nDepth); */ + + for(j = 0; j < psNode->nShapeCount; j++) + { + coord bMinX = pabyShapeDesc[0]; + coord bMinY = pabyShapeDesc[1]; + coord bMaxX = pabyShapeDesc[2]; + coord bMaxY = pabyShapeDesc[3]; + + if( SEARCH_BB_INTERSECTS(bMinX, bMinY, bMaxX, bMaxY) ) + { + int nShapeId; + + nShapeId = READ_MSB_INT(pabyShapeDesc + 4); + + /* Caution : we count shape id starting from 0, and not 1 */ + nShapeId --; + + /*printf("shape=%d, minx=%d, miny=%d, maxx=%d, maxy=%d\n", + nShapeId, bMinX, bMinY, bMaxX, bMaxY);*/ + + if( !SBNAddShapeId( psSearch, nShapeId ) ) + return FALSE; + } + + pabyShapeDesc += 8; + } + } + +/* -------------------------------------------------------------------- */ +/* If the node has attached shapes (that are not (yet) cached), */ +/* then retrieve them from disk. */ +/* -------------------------------------------------------------------- */ + + else if (psNode->nBinCount > 0) + { + uchar abyBinHeader[8]; + int nBinSize, nShapes; + int nShapeCountAcc = 0; + int i, j; + + /* printf("nNodeId = %d, nDepth = %d\n", nNodeId, nDepth); */ + + hSBN->sHooks.FSeek(hSBN->fpSBN, psNode->nBinOffset, SEEK_SET); + + if (nDepth < CACHED_DEPTH_LIMIT) + psNode->pabyShapeDesc = (uchar*) malloc(psNode->nShapeCount * 8); + + for(i = 0; i < psNode->nBinCount; i++) + { + uchar* pabyBinShape; + +#ifdef DEBUG_IO + psSearch->nBytesRead += 8; +#endif + if( hSBN->sHooks.FRead(abyBinHeader, 8, 1, + hSBN->fpSBN) != 1) + { + hSBN->sHooks.Error( "I/O error" ); + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + return FALSE; + } + + if ( READ_MSB_INT(abyBinHeader + 0) != psNode->nBinStart + i ) + { + hSBN->sHooks.Error( "Unexpected bin id" ); + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + return FALSE; + } + + nBinSize = READ_MSB_INT(abyBinHeader + 4); + nBinSize *= 2; /* 16-bit words */ + + nShapes = nBinSize / 8; + + /* Bins are always limited to 100 features */ + if( (nBinSize % 8) != 0 || nShapes <= 0 || nShapes > 100) + { + hSBN->sHooks.Error( "Unexpected bin size" ); + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + return FALSE; + } + + if( nShapeCountAcc + nShapes > psNode->nShapeCount) + { + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + hSBN->sHooks.Error( "Inconsistent shape count for bin" ); + return FALSE; + } + + if (nDepth < CACHED_DEPTH_LIMIT && psNode->pabyShapeDesc != NULL) + { + pabyBinShape = psNode->pabyShapeDesc + nShapeCountAcc * 8; + } + else + { + pabyBinShape = psSearch->abyBinShape; + } + +#ifdef DEBUG_IO + psSearch->nBytesRead += nBinSize; +#endif + if (hSBN->sHooks.FRead(pabyBinShape, nBinSize, 1, + hSBN->fpSBN) != 1) + { + hSBN->sHooks.Error( "I/O error" ); + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + return FALSE; + } + + nShapeCountAcc += nShapes; + + if (i == 0 && !psNode->bBBoxInit) + { + psNode->bMinX = pabyBinShape[0]; + psNode->bMinY = pabyBinShape[1]; + psNode->bMaxX = pabyBinShape[2]; + psNode->bMaxY = pabyBinShape[3]; + } + + for(j = 0; j < nShapes; j++) + { + coord bMinX = pabyBinShape[0]; + coord bMinY = pabyBinShape[1]; + coord bMaxX = pabyBinShape[2]; + coord bMaxY = pabyBinShape[3]; + + if( !psNode->bBBoxInit ) + { +#ifdef sanity_checks +/* -------------------------------------------------------------------- */ +/* Those tests only check that the shape bounding box in the bin */ +/* are consistent (self-consistent and consistent with the node */ +/* they are attached to). They are optional however (as far as */ +/* the safety of runtime is concerned at least). */ +/* -------------------------------------------------------------------- */ + + if( !(((bMinX < bMaxX || + (bMinX == 0 && bMaxX == 0) || + (bMinX == 255 && bMaxX == 255))) && + ((bMinY < bMaxY || + (bMinY == 0 && bMaxY == 0) || + (bMinY == 255 && bMaxY == 255)))) || + bMaxX < bNodeMinX || bMaxY < bNodeMinY || + bMinX > bNodeMaxX || bMinY > bNodeMaxY ) + { + /*printf("shape %d %d %d %d\n", bMinX, bMinY, bMaxX, bMaxY); + printf("node %d %d %d %d\n", bNodeMinX, bNodeMinY, bNodeMaxX, bNodeMaxY);*/ + hSBN->sHooks.Error( + "Invalid shape bounding box in bin" ); + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + return FALSE; + } +#endif + if (bMinX < psNode->bMinX) psNode->bMinX = bMinX; + if (bMinY < psNode->bMinY) psNode->bMinY = bMinY; + if (bMaxX > psNode->bMaxX) psNode->bMaxX = bMaxX; + if (bMaxY > psNode->bMaxY) psNode->bMaxY = bMaxY; + } + + if( SEARCH_BB_INTERSECTS(bMinX, bMinY, bMaxX, bMaxY) ) + { + int nShapeId; + + nShapeId = READ_MSB_INT(pabyBinShape + 4); + + /* Caution : we count shape id starting from 0, and not 1 */ + nShapeId --; + + /*printf("shape=%d, minx=%d, miny=%d, maxx=%d, maxy=%d\n", + nShapeId, bMinX, bMinY, bMaxX, bMaxY);*/ + + if( !SBNAddShapeId( psSearch, nShapeId ) ) + return FALSE; + } + + pabyBinShape += 8; + } + } + + if( nShapeCountAcc != psNode->nShapeCount) + { + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + hSBN->sHooks.Error( "Inconsistent shape count for bin" ); + return FALSE; + } + + psNode->bBBoxInit = TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Look up in child nodes. */ +/* -------------------------------------------------------------------- */ + if( nDepth + 1 < hSBN->nMaxDepth ) + { + nNodeId = nNodeId * 2 + 1; + + if( (nDepth % 2) == 0 ) /* x split */ + { + coord bMid = (coord) (1 + ((int)bNodeMinX + bNodeMaxX) / 2); + if( bSearchMinX <= bMid - 1 && + !SBNSearchDiskInternal( psSearch, nDepth + 1, nNodeId + 1, + bNodeMinX, bNodeMinY, + bMid - 1, bNodeMaxY ) ) + { + return FALSE; + } + if( bSearchMaxX >= bMid && + !SBNSearchDiskInternal( psSearch, nDepth + 1, nNodeId, + bMid, bNodeMinY, + bNodeMaxX, bNodeMaxY ) ) + { + return FALSE; + } + } + else /* y split */ + { + coord bMid = (coord) (1 + ((int)bNodeMinY + bNodeMaxY) / 2); + if( bSearchMinY <= bMid - 1 && + !SBNSearchDiskInternal( psSearch, nDepth + 1, nNodeId + 1, + bNodeMinX, bNodeMinY, + bNodeMaxX, bMid - 1 ) ) + { + return FALSE; + } + if( bSearchMaxY >= bMid && + !SBNSearchDiskInternal( psSearch, nDepth + 1, nNodeId, + bNodeMinX, bMid, + bNodeMaxX, bNodeMaxY ) ) + { + return FALSE; + } + } + } + + return TRUE; +} + +/************************************************************************/ +/* compare_ints() */ +/************************************************************************/ + +/* helper for qsort */ +static int +compare_ints( const void * a, const void * b) +{ + return (*(int*)a) - (*(int*)b); +} + +/************************************************************************/ +/* SBNSearchDiskTree() */ +/************************************************************************/ + +int* SBNSearchDiskTree( SBNSearchHandle hSBN, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ) +{ + double dfMinX, dfMinY, dfMaxX, dfMaxY; + double dfDiskXExtent, dfDiskYExtent; + int bMinX, bMinY, bMaxX, bMaxY; + + *pnShapeCount = 0; + + dfMinX = padfBoundsMin[0]; + dfMinY = padfBoundsMin[1]; + dfMaxX = padfBoundsMax[0]; + dfMaxY = padfBoundsMax[1]; + + if( dfMinX > dfMaxX || dfMinY > dfMaxY ) + return NULL; + + if( dfMaxX < hSBN->dfMinX || dfMaxY < hSBN->dfMinY || + dfMinX > hSBN->dfMaxX || dfMinY > hSBN->dfMaxY ) + return NULL; + +/* -------------------------------------------------------------------- */ +/* Compute the search coordinates in [0,255]x[0,255] coord. space */ +/* -------------------------------------------------------------------- */ + dfDiskXExtent = hSBN->dfMaxX - hSBN->dfMinX; + dfDiskYExtent = hSBN->dfMaxY - hSBN->dfMinY; + + if ( dfDiskXExtent == 0.0 ) + { + bMinX = 0; + bMaxX = 255; + } + else + { + if( dfMinX < hSBN->dfMinX ) + bMinX = 0; + else + { + double dfMinX_255 = (dfMinX - hSBN->dfMinX) + / dfDiskXExtent * 255.0; + bMinX = (int)floor(dfMinX_255 - 0.005); + if( bMinX < 0 ) bMinX = 0; + } + + if( dfMaxX > hSBN->dfMaxX ) + bMaxX = 255; + else + { + double dfMaxX_255 = (dfMaxX - hSBN->dfMinX) + / dfDiskXExtent * 255.0; + bMaxX = (int)ceil(dfMaxX_255 + 0.005); + if( bMaxX > 255 ) bMaxX = 255; + } + } + + if ( dfDiskYExtent == 0.0 ) + { + bMinY = 0; + bMaxY = 255; + } + else + { + if( dfMinY < hSBN->dfMinY ) + bMinY = 0; + else + { + double dfMinY_255 = (dfMinY - hSBN->dfMinY) + / dfDiskYExtent * 255.0; + bMinY = (int)floor(dfMinY_255 - 0.005); + if( bMinY < 0 ) bMinY = 0; + } + + if( dfMaxY > hSBN->dfMaxY ) + bMaxY = 255; + else + { + double dfMaxY_255 = (dfMaxY - hSBN->dfMinY) + / dfDiskYExtent * 255.0; + bMaxY = (int)ceil(dfMaxY_255 + 0.005); + if( bMaxY > 255 ) bMaxY = 255; + } + } + +/* -------------------------------------------------------------------- */ +/* Run the search. */ +/* -------------------------------------------------------------------- */ + + return SBNSearchDiskTreeInteger(hSBN, + bMinX, bMinY, bMaxX, bMaxY, + pnShapeCount); +} + +/************************************************************************/ +/* SBNSearchDiskTreeInteger() */ +/************************************************************************/ + +int* SBNSearchDiskTreeInteger( SBNSearchHandle hSBN, + int bMinX, int bMinY, int bMaxX, int bMaxY, + int *pnShapeCount ) +{ + SearchStruct sSearch; + int bRet; + + *pnShapeCount = 0; + + if( bMinX > bMaxX || bMinY > bMaxY ) + return NULL; + + if( bMaxX < 0 || bMaxY < 0 || bMinX > 255 || bMinY > 255 ) + return NULL; + + if( hSBN->nShapeCount == 0 ) + return NULL; +/* -------------------------------------------------------------------- */ +/* Run the search. */ +/* -------------------------------------------------------------------- */ + memset( &sSearch, 0, sizeof(sSearch) ); + sSearch.hSBN = hSBN; + sSearch.bMinX = (coord) (bMinX >= 0 ? bMinX : 0); + sSearch.bMinY = (coord) (bMinY >= 0 ? bMinY : 0); + sSearch.bMaxX = (coord) (bMaxX <= 255 ? bMaxX : 255); + sSearch.bMaxY = (coord) (bMaxY <= 255 ? bMaxY : 255); + sSearch.nShapeCount = 0; + sSearch.nShapeAlloc = 0; + sSearch.panShapeId = (int*) calloc(1, sizeof(int)); +#ifdef DEBUG_IO + sSearch.nBytesRead = 0; +#endif + + bRet = SBNSearchDiskInternal(&sSearch, 0, 0, 0, 0, 255, 255); + +#ifdef DEBUG_IO + hSBN->nTotalBytesRead += sSearch.nBytesRead; + /* printf("nBytesRead = %d\n", sSearch.nBytesRead); */ +#endif + + if( !bRet ) + { + free( sSearch.panShapeId ); + *pnShapeCount = 0; + return NULL; + } + + *pnShapeCount = sSearch.nShapeCount; + +/* -------------------------------------------------------------------- */ +/* Sort the id array */ +/* -------------------------------------------------------------------- */ + qsort(sSearch.panShapeId, *pnShapeCount, sizeof(int), compare_ints); + + return sSearch.panShapeId; +} + +/************************************************************************/ +/* SBNSearchFreeIds() */ +/************************************************************************/ + +void SBNSearchFreeIds( int* panShapeId ) +{ + free( panShapeId ); +} diff --git a/src/Shapefile/shapefil.h b/support/ShapeLib/shapefil.h similarity index 68% rename from src/Shapefile/shapefil.h rename to support/ShapeLib/shapefil.h index 3a9cad43..8c5311c4 100644 --- a/src/Shapefile/shapefil.h +++ b/support/ShapeLib/shapefil.h @@ -1,612 +1,624 @@ -#ifndef SHAPEFILE_H_INCLUDED -#define SHAPEFILE_H_INCLUDED - -/****************************************************************************** - * $Id: shapefil.h 18681 2010-01-28 11:37:07Z warmerdam $ - * - * Project: Shapelib - * Purpose: Primary include file for Shapelib. - * Author: Frank Warmerdam, warmerdam@pobox.com - * - ****************************************************************************** - * Copyright (c) 1999, Frank Warmerdam - * - * This software is available under the following "MIT Style" license, - * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This - * option is discussed in more detail in shapelib.html. - * - * -- - * - * 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. - ****************************************************************************** - * - * $Log: shapefil.h,v $ - * Revision 1.47 2010-01-28 11:34:34 fwarmerdam - * handle the shape file length limits more gracefully (#3236) - * - * Revision 1.46 2008-11-12 14:28:15 fwarmerdam - * DBFCreateField() now works on files with records - * - * Revision 1.45 2008/11/11 17:47:10 fwarmerdam - * added DBFDeleteField() function - * - * Revision 1.44 2008/01/16 20:05:19 bram - * Add file hooks that accept UTF-8 encoded filenames on some platforms. Use SASetupUtf8Hooks - * tosetup the hooks and check SHPAPI_UTF8_HOOKS for its availability. Currently, this - * is only available on the Windows platform that decodes the UTF-8 filenames to wide - * character strings and feeds them to _wfopen and _wremove. - * - * Revision 1.43 2008/01/10 16:35:30 fwarmerdam - * avoid _ prefix on #defined symbols (bug 1840) - * - * Revision 1.42 2007/12/18 18:28:14 bram - * - create hook for client specific atof (bugzilla ticket 1615) - * - check for NULL handle before closing cpCPG file, and close after reading. - * - * Revision 1.41 2007/12/15 20:25:32 bram - * dbfopen.c now reads the Code Page information from the DBF file, and exports - * this information as a string through the DBFGetCodePage function. This is - * either the number from the LDID header field ("LDID/") or as the - * content of an accompanying .CPG file. When creating a DBF file, the code can - * be set using DBFCreateEx. - * - * Revision 1.40 2007/12/06 07:00:25 fwarmerdam - * dbfopen now using SAHooks for fileio - * - * Revision 1.39 2007/12/04 20:37:56 fwarmerdam - * preliminary implementation of hooks api for io and errors - * - * Revision 1.38 2007/11/21 22:39:56 fwarmerdam - * close shx file in readonly mode (GDAL #1956) - * - * Revision 1.37 2007/10/27 03:31:14 fwarmerdam - * limit default depth of tree to 12 levels (gdal ticket #1594) - * - * Revision 1.36 2007/09/10 23:33:15 fwarmerdam - * Upstreamed support for visibility flag in SHPAPI_CALL for the needs - * of GDAL (gdal ticket #1810). - * - * Revision 1.35 2007/09/03 19:48:10 fwarmerdam - * move DBFReadAttribute() static dDoubleField into dbfinfo - * - * Revision 1.34 2006/06/17 15:33:32 fwarmerdam - * added pszWorkField - bug 1202 (rso) - * - * Revision 1.33 2006/02/15 01:14:30 fwarmerdam - * added DBFAddNativeFieldType - * - * Revision 1.32 2006/01/26 15:07:32 fwarmerdam - * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 - * - * Revision 1.31 2006/01/05 01:27:27 fwarmerdam - * added dbf deletion mark/fetch - * - * Revision 1.30 2005/01/03 22:30:13 fwarmerdam - * added support for saved quadtrees - * - * Revision 1.29 2004/09/26 20:09:35 fwarmerdam - * avoid rcsid warnings - * - * Revision 1.28 2003/12/29 06:02:18 fwarmerdam - * added cpl_error.h option - * - * Revision 1.27 2003/04/21 18:30:37 warmerda - * added header write/update public methods - * - * Revision 1.26 2002/09/29 00:00:08 warmerda - * added FTLogical and logical attribute read/write calls - * - * Revision 1.25 2002/05/07 13:46:30 warmerda - * added DBFWriteAttributeDirectly(). - * - * Revision 1.24 2002/04/10 16:59:54 warmerda - * added SHPRewindObject - * - * Revision 1.23 2002/01/15 14:36:07 warmerda - * updated email address - * - * Revision 1.22 2002/01/15 14:32:00 warmerda - * try to improve SHPAPI_CALL docs - */ - -#include - -#ifdef USE_DBMALLOC -#include -#endif - -#ifdef USE_CPL -#include "cpl_error.h" -#include "cpl_vsi.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/************************************************************************/ -/* Configuration options. */ -/************************************************************************/ - -/* -------------------------------------------------------------------- */ -/* Should the DBFReadStringAttribute() strip leading and */ -/* trailing white space? */ -/* -------------------------------------------------------------------- */ -#define TRIM_DBF_WHITESPACE - -/* -------------------------------------------------------------------- */ -/* Should we write measure values to the Multipatch object? */ -/* Reportedly ArcView crashes if we do write it, so for now it */ -/* is disabled. */ -/* -------------------------------------------------------------------- */ -#define DISABLE_MULTIPATCH_MEASURE - -/* -------------------------------------------------------------------- */ -/* SHPAPI_CALL */ -/* */ -/* The following two macros are present to allow forcing */ -/* various calling conventions on the Shapelib API. */ -/* */ -/* To force __stdcall conventions (needed to call Shapelib */ -/* from Visual Basic and/or Dephi I believe) the makefile could */ -/* be modified to define: */ -/* */ -/* /DSHPAPI_CALL=__stdcall */ -/* */ -/* If it is desired to force export of the Shapelib API without */ -/* using the shapelib.def file, use the following definition. */ -/* */ -/* /DSHAPELIB_DLLEXPORT */ -/* */ -/* To get both at once it will be necessary to hack this */ -/* include file to define: */ -/* */ -/* #define SHPAPI_CALL __declspec(dllexport) __stdcall */ -/* #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall */ -/* */ -/* The complexity of the situtation is partly caused by the */ -/* peculiar requirement of Visual C++ that __stdcall appear */ -/* after any "*"'s in the return value of a function while the */ -/* __declspec(dllexport) must appear before them. */ -/* -------------------------------------------------------------------- */ - -#ifdef SHAPELIB_DLLEXPORT -# define SHPAPI_CALL __declspec(dllexport) -# define SHPAPI_CALL1(x) __declspec(dllexport) x -#endif - -#ifndef SHPAPI_CALL -# if defined(USE_GCC_VISIBILITY_FLAG) -# define SHPAPI_CALL __attribute__ ((visibility("default"))) -# define SHPAPI_CALL1(x) __attribute__ ((visibility("default"))) x -# else -# define SHPAPI_CALL -# endif -#endif - -#ifndef SHPAPI_CALL1 -# define SHPAPI_CALL1(x) x SHPAPI_CALL -#endif - -/* -------------------------------------------------------------------- */ -/* Macros for controlling CVSID and ensuring they don't appear */ -/* as unreferenced variables resulting in lots of warnings. */ -/* -------------------------------------------------------------------- */ -#ifndef DISABLE_CVSID -# define SHP_CVSID(string) static char cpl_cvsid[] = string; \ -static char *cvsid_aw() { return( cvsid_aw() ? ((char *) NULL) : cpl_cvsid ); } -#else -# define SHP_CVSID(string) -#endif - -/* -------------------------------------------------------------------- */ -/* On some platforms, additional file IO hooks are defined that */ -/* UTF-8 encoded filenames Unicode filenames */ -/* -------------------------------------------------------------------- */ -#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define SHPAPI_WINDOWS -# define SHPAPI_UTF8_HOOKS -#endif - -/* -------------------------------------------------------------------- */ -/* IO/Error hook functions. */ -/* -------------------------------------------------------------------- */ -typedef int *SAFile; - -#ifndef SAOffset -typedef unsigned long SAOffset; -#endif - -typedef struct { - SAFile (*FOpen) ( const char *filename, const char *access); - SAOffset (*FRead) ( void *p, SAOffset size, SAOffset nmemb, SAFile file); - SAOffset (*FWrite)( void *p, SAOffset size, SAOffset nmemb, SAFile file); - SAOffset (*FSeek) ( SAFile file, SAOffset offset, int whence ); - SAOffset (*FTell) ( SAFile file ); - int (*FFlush)( SAFile file ); - int (*FClose)( SAFile file ); - int (*Remove) ( const char *filename ); - - void (*Error) ( const char *message ); - double (*Atof) ( const char *str ); -} SAHooks; - -void SHPAPI_CALL SASetupDefaultHooks( SAHooks *psHooks ); -#ifdef SHPAPI_UTF8_HOOKS -void SHPAPI_CALL SASetupUtf8Hooks( SAHooks *psHooks ); -#endif - -/************************************************************************/ -/* SHP Support. */ -/************************************************************************/ -typedef struct -{ - SAHooks sHooks; - - SAFile fpSHP; - SAFile fpSHX; - - int nShapeType; /* SHPT_* */ - - unsigned int nFileSize; /* SHP file */ - - int nRecords; - int nMaxRecords; - unsigned int *panRecOffset; - unsigned int *panRecSize; - - double adBoundsMin[4]; - double adBoundsMax[4]; - - int bUpdated; - - unsigned char *pabyRec; - int nBufSize; -} SHPInfo; - -typedef SHPInfo * SHPHandle; - -/* -------------------------------------------------------------------- */ -/* Shape types (nSHPType) */ -/* -------------------------------------------------------------------- */ -#define SHPT_NULL 0 -#define SHPT_POINT 1 -#define SHPT_ARC 3 -#define SHPT_POLYGON 5 -#define SHPT_MULTIPOINT 8 -#define SHPT_POINTZ 11 -#define SHPT_ARCZ 13 -#define SHPT_POLYGONZ 15 -#define SHPT_MULTIPOINTZ 18 -#define SHPT_POINTM 21 -#define SHPT_ARCM 23 -#define SHPT_POLYGONM 25 -#define SHPT_MULTIPOINTM 28 -#define SHPT_MULTIPATCH 31 - - -/* -------------------------------------------------------------------- */ -/* Part types - everything but SHPT_MULTIPATCH just uses */ -/* SHPP_RING. */ -/* -------------------------------------------------------------------- */ - -#define SHPP_TRISTRIP 0 -#define SHPP_TRIFAN 1 -#define SHPP_OUTERRING 2 -#define SHPP_INNERRING 3 -#define SHPP_FIRSTRING 4 -#define SHPP_RING 5 - -/* -------------------------------------------------------------------- */ -/* SHPObject - represents on shape (without attributes) read */ -/* from the .shp file. */ -/* -------------------------------------------------------------------- */ -typedef struct -{ - int nSHPType; - - int nShapeId; /* -1 is unknown/unassigned */ - - int nParts; - int *panPartStart; - int *panPartType; - - int nVertices; - double *padfX; - double *padfY; - double *padfZ; - double *padfM; - - double dfXMin; - double dfYMin; - double dfZMin; - double dfMMin; - - double dfXMax; - double dfYMax; - double dfZMax; - double dfMMax; - - int bMeasureIsUsed; -} SHPObject; - -/* -------------------------------------------------------------------- */ -/* SHP API Prototypes */ -/* -------------------------------------------------------------------- */ - -/* If pszAccess is read-only, the fpSHX field of the returned structure */ -/* will be NULL as it is not necessary to keep the SHX file open */ -SHPHandle SHPAPI_CALL - SHPOpen( const char * pszShapeFile, const char * pszAccess ); -SHPHandle SHPAPI_CALL - SHPOpenLL( const char *pszShapeFile, const char *pszAccess, - SAHooks *psHooks ); -SHPHandle SHPAPI_CALL - SHPCreate( const char * pszShapeFile, int nShapeType ); -SHPHandle SHPAPI_CALL - SHPCreateLL( const char * pszShapeFile, int nShapeType, - SAHooks *psHooks ); -void SHPAPI_CALL - SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType, - double * padfMinBound, double * padfMaxBound ); - -SHPObject SHPAPI_CALL1(*) - SHPReadObject( SHPHandle hSHP, int iShape ); -int SHPAPI_CALL - SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject ); - -void SHPAPI_CALL - SHPDestroyObject( SHPObject * psObject ); -void SHPAPI_CALL - SHPComputeExtents( SHPObject * psObject ); -SHPObject SHPAPI_CALL1(*) - SHPCreateObject( int nSHPType, int nShapeId, int nParts, - const int * panPartStart, const int * panPartType, - int nVertices, - const double * padfX, const double * padfY, - const double * padfZ, const double * padfM ); -SHPObject SHPAPI_CALL1(*) - SHPCreateSimpleObject( int nSHPType, int nVertices, - const double * padfX, - const double * padfY, - const double * padfZ ); - -int SHPAPI_CALL - SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ); - -void SHPAPI_CALL SHPClose( SHPHandle hSHP ); -void SHPAPI_CALL SHPWriteHeader( SHPHandle hSHP ); - -const char SHPAPI_CALL1(*) - SHPTypeName( int nSHPType ); -const char SHPAPI_CALL1(*) - SHPPartTypeName( int nPartType ); - -/* -------------------------------------------------------------------- */ -/* Shape quadtree indexing API. */ -/* -------------------------------------------------------------------- */ - -/* this can be two or four for binary or quad tree */ -#define MAX_SUBNODE 4 - -/* upper limit of tree levels for automatic estimation */ -#define MAX_DEFAULT_TREE_DEPTH 12 - -typedef struct shape_tree_node -{ - /* region covered by this node */ - double adfBoundsMin[4]; - double adfBoundsMax[4]; - - /* list of shapes stored at this node. The papsShapeObj pointers - or the whole list can be NULL */ - int nShapeCount; - int *panShapeIds; - SHPObject **papsShapeObj; - - int nSubNodes; - struct shape_tree_node *apsSubNode[MAX_SUBNODE]; - -} SHPTreeNode; - -typedef struct -{ - SHPHandle hSHP; - - int nMaxDepth; - int nDimension; - int nTotalCount; - - SHPTreeNode *psRoot; -} SHPTree; - -SHPTree SHPAPI_CALL1(*) - SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, - double *padfBoundsMin, double *padfBoundsMax ); -void SHPAPI_CALL - SHPDestroyTree( SHPTree * hTree ); - -int SHPAPI_CALL - SHPWriteTree( SHPTree *hTree, const char * pszFilename ); -SHPTree SHPAPI_CALL - SHPReadTree( const char * pszFilename ); - -int SHPAPI_CALL - SHPTreeAddObject( SHPTree * hTree, SHPObject * psObject ); -int SHPAPI_CALL - SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject ); -int SHPAPI_CALL - SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId ); - -void SHPAPI_CALL - SHPTreeTrimExtraNodes( SHPTree * hTree ); - -int SHPAPI_CALL1(*) - SHPTreeFindLikelyShapes( SHPTree * hTree, - double * padfBoundsMin, - double * padfBoundsMax, - int * ); -int SHPAPI_CALL - SHPCheckBoundsOverlap( double *, double *, double *, double *, int ); - -int SHPAPI_CALL1(*) -SHPSearchDiskTree( FILE *fp, - double *padfBoundsMin, double *padfBoundsMax, - int *pnShapeCount ); - -/************************************************************************/ -/* DBF Support. */ -/************************************************************************/ -typedef struct -{ - SAHooks sHooks; - - SAFile fp; - - int nRecords; - - int nRecordLength; - int nHeaderLength; - int nFields; - int *panFieldOffset; - int *panFieldSize; - int *panFieldDecimals; - char *pachFieldType; - - char *pszHeader; - - int nCurrentRecord; - int bCurrentRecordModified; - char *pszCurrentRecord; - - int nWorkFieldLength; - char *pszWorkField; - - int bNoHeader; - int bUpdated; - - double dfDoubleField; - - int iLanguageDriver; - char *pszCodePage; -} DBFInfo; - -typedef DBFInfo * DBFHandle; - -typedef enum { - FTString, - FTInteger, - FTDouble, - FTLogical, - FTInvalid -} DBFFieldType; - -#define XBASE_FLDHDR_SZ 32 - - -DBFHandle SHPAPI_CALL - DBFOpen( const char * pszDBFFile, const char * pszAccess ); -DBFHandle SHPAPI_CALL - DBFOpenLL( const char * pszDBFFile, const char * pszAccess, - SAHooks *psHooks ); -DBFHandle SHPAPI_CALL - DBFCreate( const char * pszDBFFile ); -DBFHandle SHPAPI_CALL - DBFCreateEx( const char * pszDBFFile, const char * pszCodePage ); -DBFHandle SHPAPI_CALL - DBFCreateLL( const char * pszDBFFile, const char * pszCodePage, SAHooks *psHooks ); - -int SHPAPI_CALL - DBFGetFieldCount( DBFHandle psDBF ); -int SHPAPI_CALL - DBFGetRecordCount( DBFHandle psDBF ); -int SHPAPI_CALL - DBFAddField( DBFHandle hDBF, const char * pszFieldName, - DBFFieldType eType, int nWidth, int nDecimals ); - -int SHPAPI_CALL - DBFAddNativeFieldType( DBFHandle hDBF, const char * pszFieldName, - char chType, int nWidth, int nDecimals ); - -int SHPAPI_CALL - DBFDeleteField( DBFHandle hDBF, int iField ); - -DBFFieldType SHPAPI_CALL - DBFGetFieldInfo( DBFHandle psDBF, int iField, - char * pszFieldName, int * pnWidth, int * pnDecimals ); - -int SHPAPI_CALL - DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName); - -int SHPAPI_CALL - DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField ); -double SHPAPI_CALL - DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField ); -const char SHPAPI_CALL1(*) - DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField ); -const char SHPAPI_CALL1(*) - DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField ); -int SHPAPI_CALL - DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField ); - -int SHPAPI_CALL - DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField, - int nFieldValue ); -int SHPAPI_CALL - DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField, - double dFieldValue ); -int SHPAPI_CALL - DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField, - const char * pszFieldValue ); -int SHPAPI_CALL - DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField ); - -int SHPAPI_CALL - DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField, - const char lFieldValue); -int SHPAPI_CALL - DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, - void * pValue ); -const char SHPAPI_CALL1(*) - DBFReadTuple(DBFHandle psDBF, int hEntity ); -int SHPAPI_CALL - DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ); - -int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ); -int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, - int bIsDeleted ); - -DBFHandle SHPAPI_CALL - DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ); - -void SHPAPI_CALL - DBFClose( DBFHandle hDBF ); -void SHPAPI_CALL - DBFUpdateHeader( DBFHandle hDBF ); -char SHPAPI_CALL - DBFGetNativeFieldType( DBFHandle hDBF, int iField ); - -const char SHPAPI_CALL1(*) - DBFGetCodePage(DBFHandle psDBF ); - -#ifdef __cplusplus -} -#endif - -#endif /* ndef SHAPEFILE_H_INCLUDED */ +#ifndef SHAPEFILE_H_INCLUDED +#define SHAPEFILE_H_INCLUDED + +/****************************************************************************** + * $Id: shapefil.h 37997 2017-04-14 10:20:57Z rouault $ + * + * Project: Shapelib + * Purpose: Primary include file for Shapelib. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * Copyright (c) 2012-2016, Even Rouault + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + */ + +#include + +#ifdef USE_DBMALLOC +#include +#endif + +#ifdef USE_CPL +#include "cpl_conv.h" + +/* Hide shapelib symbols in GDAL builds --with-hide-internal-symbols */ +#if !defined(SHPAPI_CALL) && defined(USE_GCC_VISIBILITY_FLAG) +#define SHPAPI_CALL +#endif + +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************/ +/* Configuration options. */ +/************************************************************************/ + +/* -------------------------------------------------------------------- */ +/* Should the DBFReadStringAttribute() strip leading and */ +/* trailing white space? */ +/* -------------------------------------------------------------------- */ +#define TRIM_DBF_WHITESPACE + +/* -------------------------------------------------------------------- */ +/* Should we write measure values to the Multipatch object? */ +/* Reportedly ArcView crashes if we do write it, so for now it */ +/* is disabled. */ +/* -------------------------------------------------------------------- */ +#define DISABLE_MULTIPATCH_MEASURE + +/* -------------------------------------------------------------------- */ +/* SHPAPI_CALL */ +/* */ +/* The following two macros are present to allow forcing */ +/* various calling conventions on the Shapelib API. */ +/* */ +/* To force __stdcall conventions (needed to call Shapelib */ +/* from Visual Basic and/or Dephi I believe) the makefile could */ +/* be modified to define: */ +/* */ +/* /DSHPAPI_CALL=__stdcall */ +/* */ +/* If it is desired to force export of the Shapelib API without */ +/* using the shapelib.def file, use the following definition. */ +/* */ +/* /DSHAPELIB_DLLEXPORT */ +/* */ +/* To get both at once it will be necessary to hack this */ +/* include file to define: */ +/* */ +/* #define SHPAPI_CALL __declspec(dllexport) __stdcall */ +/* #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall */ +/* */ +/* The complexity of the situation is partly caused by the */ +/* peculiar requirement of Visual C++ that __stdcall appear */ +/* after any "*"'s in the return value of a function while the */ +/* __declspec(dllexport) must appear before them. */ +/* -------------------------------------------------------------------- */ + +#ifdef SHAPELIB_DLLEXPORT +# define SHPAPI_CALL __declspec(dllexport) +# define SHPAPI_CALL1(x) __declspec(dllexport) x +#endif + +#ifndef SHPAPI_CALL +# if defined(USE_GCC_VISIBILITY_FLAG) +# define SHPAPI_CALL __attribute__ ((visibility("default"))) +# define SHPAPI_CALL1(x) __attribute__ ((visibility("default"))) x +# else +# define SHPAPI_CALL +# endif +#endif + +#ifndef SHPAPI_CALL1 +# define SHPAPI_CALL1(x) x SHPAPI_CALL +#endif + +/* -------------------------------------------------------------------- */ +/* Macros for controlling CVSID and ensuring they don't appear */ +/* as unreferenced variables resulting in lots of warnings. */ +/* -------------------------------------------------------------------- */ +#ifndef DISABLE_CVSID +# if defined(__GNUC__) && __GNUC__ >= 4 +# define SHP_CVSID(string) static const char cpl_cvsid[] __attribute__((used)) = string; +# else +# define SHP_CVSID(string) static const char cpl_cvsid[] = string; \ +static const char *cvsid_aw() { return( cvsid_aw() ? NULL : cpl_cvsid ); } +# endif +#else +# define SHP_CVSID(string) +#endif + +/* -------------------------------------------------------------------- */ +/* On some platforms, additional file IO hooks are defined that */ +/* UTF-8 encoded filenames Unicode filenames */ +/* -------------------------------------------------------------------- */ +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define SHPAPI_WINDOWS +# define SHPAPI_UTF8_HOOKS +#endif + +/* -------------------------------------------------------------------- */ +/* IO/Error hook functions. */ +/* -------------------------------------------------------------------- */ +typedef int *SAFile; + +#ifndef SAOffset +typedef unsigned long SAOffset; +#endif + +typedef struct { + SAFile (*FOpen) ( const char *filename, const char *access); + SAOffset (*FRead) ( void *p, SAOffset size, SAOffset nmemb, SAFile file); + SAOffset (*FWrite)( void *p, SAOffset size, SAOffset nmemb, SAFile file); + SAOffset (*FSeek) ( SAFile file, SAOffset offset, int whence ); + SAOffset (*FTell) ( SAFile file ); + int (*FFlush)( SAFile file ); + int (*FClose)( SAFile file ); + int (*Remove) ( const char *filename ); + + void (*Error) ( const char *message ); + double (*Atof) ( const char *str ); +} SAHooks; + +void SHPAPI_CALL SASetupDefaultHooks( SAHooks *psHooks ); +#ifdef SHPAPI_UTF8_HOOKS +void SHPAPI_CALL SASetupUtf8Hooks( SAHooks *psHooks ); +#endif + +/************************************************************************/ +/* SHP Support. */ +/************************************************************************/ +typedef struct tagSHPObject SHPObject; + +typedef struct +{ + SAHooks sHooks; + + SAFile fpSHP; + SAFile fpSHX; + + int nShapeType; /* SHPT_* */ + + unsigned int nFileSize; /* SHP file */ + + int nRecords; + int nMaxRecords; + unsigned int*panRecOffset; + unsigned int *panRecSize; + + double adBoundsMin[4]; + double adBoundsMax[4]; + + int bUpdated; + + unsigned char *pabyRec; + int nBufSize; + + int bFastModeReadObject; + unsigned char *pabyObjectBuf; + int nObjectBufSize; + SHPObject* psCachedObject; +} SHPInfo; + +typedef SHPInfo * SHPHandle; + +/* -------------------------------------------------------------------- */ +/* Shape types (nSHPType) */ +/* -------------------------------------------------------------------- */ +#define SHPT_NULL 0 +#define SHPT_POINT 1 +#define SHPT_ARC 3 +#define SHPT_POLYGON 5 +#define SHPT_MULTIPOINT 8 +#define SHPT_POINTZ 11 +#define SHPT_ARCZ 13 +#define SHPT_POLYGONZ 15 +#define SHPT_MULTIPOINTZ 18 +#define SHPT_POINTM 21 +#define SHPT_ARCM 23 +#define SHPT_POLYGONM 25 +#define SHPT_MULTIPOINTM 28 +#define SHPT_MULTIPATCH 31 + +/* -------------------------------------------------------------------- */ +/* Part types - everything but SHPT_MULTIPATCH just uses */ +/* SHPP_RING. */ +/* -------------------------------------------------------------------- */ + +#define SHPP_TRISTRIP 0 +#define SHPP_TRIFAN 1 +#define SHPP_OUTERRING 2 +#define SHPP_INNERRING 3 +#define SHPP_FIRSTRING 4 +#define SHPP_RING 5 + +/* -------------------------------------------------------------------- */ +/* SHPObject - represents on shape (without attributes) read */ +/* from the .shp file. */ +/* -------------------------------------------------------------------- */ +struct tagSHPObject +{ + int nSHPType; + + int nShapeId; /* -1 is unknown/unassigned */ + + int nParts; + int *panPartStart; + int *panPartType; + + int nVertices; + double *padfX; + double *padfY; + double *padfZ; + double *padfM; + + double dfXMin; + double dfYMin; + double dfZMin; + double dfMMin; + + double dfXMax; + double dfYMax; + double dfZMax; + double dfMMax; + + int bMeasureIsUsed; + int bFastModeReadObject; +}; + +/* -------------------------------------------------------------------- */ +/* SHP API Prototypes */ +/* -------------------------------------------------------------------- */ + +/* If pszAccess is read-only, the fpSHX field of the returned structure */ +/* will be NULL as it is not necessary to keep the SHX file open */ +SHPHandle SHPAPI_CALL + SHPOpen( const char * pszShapeFile, const char * pszAccess ); +SHPHandle SHPAPI_CALL + SHPOpenLL( const char *pszShapeFile, const char *pszAccess, + SAHooks *psHooks ); +SHPHandle SHPAPI_CALL + SHPOpenLLEx( const char *pszShapeFile, const char *pszAccess, + SAHooks *psHooks, int bRestoreSHX ); + +int SHPAPI_CALL + SHPRestoreSHX( const char *pszShapeFile, const char *pszAccess, + SAHooks *psHooks ); + +/* If setting bFastMode = TRUE, the content of SHPReadObject() is owned by the SHPHandle. */ +/* So you cannot have 2 valid instances of SHPReadObject() simultaneously. */ +/* The SHPObject padfZ and padfM members may be NULL depending on the geometry */ +/* type. It is illegal to free at hand any of the pointer members of the SHPObject structure */ +void SHPAPI_CALL SHPSetFastModeReadObject( SHPHandle hSHP, int bFastMode ); + +SHPHandle SHPAPI_CALL + SHPCreate( const char * pszShapeFile, int nShapeType ); +SHPHandle SHPAPI_CALL + SHPCreateLL( const char * pszShapeFile, int nShapeType, + SAHooks *psHooks ); +void SHPAPI_CALL + SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType, + double * padfMinBound, double * padfMaxBound ); + +SHPObject SHPAPI_CALL1(*) + SHPReadObject( SHPHandle hSHP, int iShape ); +int SHPAPI_CALL + SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject ); + +void SHPAPI_CALL + SHPDestroyObject( SHPObject * psObject ); +void SHPAPI_CALL + SHPComputeExtents( SHPObject * psObject ); +SHPObject SHPAPI_CALL1(*) + SHPCreateObject( int nSHPType, int nShapeId, int nParts, + const int * panPartStart, const int * panPartType, + int nVertices, + const double * padfX, const double * padfY, + const double * padfZ, const double * padfM ); +SHPObject SHPAPI_CALL1(*) + SHPCreateSimpleObject( int nSHPType, int nVertices, + const double * padfX, + const double * padfY, + const double * padfZ ); + +int SHPAPI_CALL + SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ); + +void SHPAPI_CALL SHPClose( SHPHandle hSHP ); +void SHPAPI_CALL SHPWriteHeader( SHPHandle hSHP ); + +const char SHPAPI_CALL1(*) + SHPTypeName( int nSHPType ); +const char SHPAPI_CALL1(*) + SHPPartTypeName( int nPartType ); + +/* -------------------------------------------------------------------- */ +/* Shape quadtree indexing API. */ +/* -------------------------------------------------------------------- */ + +/* this can be two or four for binary or quad tree */ +#define MAX_SUBNODE 4 + +/* upper limit of tree levels for automatic estimation */ +#define MAX_DEFAULT_TREE_DEPTH 12 + +typedef struct shape_tree_node +{ + /* region covered by this node */ + double adfBoundsMin[4]; + double adfBoundsMax[4]; + + /* list of shapes stored at this node. The papsShapeObj pointers + or the whole list can be NULL */ + int nShapeCount; + int *panShapeIds; + SHPObject **papsShapeObj; + + int nSubNodes; + struct shape_tree_node *apsSubNode[MAX_SUBNODE]; + +} SHPTreeNode; + +typedef struct +{ + SHPHandle hSHP; + + int nMaxDepth; + int nDimension; + int nTotalCount; + + SHPTreeNode *psRoot; +} SHPTree; + +SHPTree SHPAPI_CALL1(*) + SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, + double *padfBoundsMin, double *padfBoundsMax ); +void SHPAPI_CALL + SHPDestroyTree( SHPTree * hTree ); + +int SHPAPI_CALL + SHPWriteTree( SHPTree *hTree, const char * pszFilename ); + +int SHPAPI_CALL + SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject ); +int SHPAPI_CALL + SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId ); + +void SHPAPI_CALL + SHPTreeTrimExtraNodes( SHPTree * hTree ); + +int SHPAPI_CALL1(*) + SHPTreeFindLikelyShapes( SHPTree * hTree, + double * padfBoundsMin, + double * padfBoundsMax, + int * ); +int SHPAPI_CALL + SHPCheckBoundsOverlap( double *, double *, double *, double *, int ); + +int SHPAPI_CALL1(*) +SHPSearchDiskTree( FILE *fp, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ); + +typedef struct SHPDiskTreeInfo* SHPTreeDiskHandle; + +SHPTreeDiskHandle SHPAPI_CALL + SHPOpenDiskTree( const char* pszQIXFilename, + SAHooks *psHooks ); + +void SHPAPI_CALL + SHPCloseDiskTree( SHPTreeDiskHandle hDiskTree ); + +int SHPAPI_CALL1(*) +SHPSearchDiskTreeEx( SHPTreeDiskHandle hDiskTree, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ); + +int SHPAPI_CALL + SHPWriteTreeLL(SHPTree *hTree, const char *pszFilename, SAHooks *psHooks ); + +/* -------------------------------------------------------------------- */ +/* SBN Search API */ +/* -------------------------------------------------------------------- */ + +typedef struct SBNSearchInfo* SBNSearchHandle; + +SBNSearchHandle SHPAPI_CALL + SBNOpenDiskTree( const char* pszSBNFilename, + SAHooks *psHooks ); + +void SHPAPI_CALL + SBNCloseDiskTree( SBNSearchHandle hSBN ); + +int SHPAPI_CALL1(*) +SBNSearchDiskTree( SBNSearchHandle hSBN, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ); + +int SHPAPI_CALL1(*) +SBNSearchDiskTreeInteger( SBNSearchHandle hSBN, + int bMinX, int bMinY, int bMaxX, int bMaxY, + int *pnShapeCount ); + +void SHPAPI_CALL SBNSearchFreeIds( int* panShapeId ); + +/************************************************************************/ +/* DBF Support. */ +/************************************************************************/ +typedef struct +{ + SAHooks sHooks; + + SAFile fp; + + int nRecords; + + int nRecordLength; /* Must fit on uint16 */ + int nHeaderLength; /* File header length (32) + field + descriptor length + spare space. + Must fit on uint16 */ + int nFields; + int *panFieldOffset; + int *panFieldSize; + int *panFieldDecimals; + char *pachFieldType; + + char *pszHeader; /* Field descriptors */ + + int nCurrentRecord; + int bCurrentRecordModified; + char *pszCurrentRecord; + + int nWorkFieldLength; + char *pszWorkField; + + int bNoHeader; + int bUpdated; + + union + { + double dfDoubleField; + int nIntField; + } fieldValue; + + int iLanguageDriver; + char *pszCodePage; + + int nUpdateYearSince1900; /* 0-255 */ + int nUpdateMonth; /* 1-12 */ + int nUpdateDay; /* 1-31 */ + + int bWriteEndOfFileChar; /* defaults to TRUE */ +} DBFInfo; + +typedef DBFInfo * DBFHandle; + +typedef enum { + FTString, + FTInteger, + FTDouble, + FTLogical, + FTDate, + FTInvalid +} DBFFieldType; + +/* Field descriptor/header size */ +#define XBASE_FLDHDR_SZ 32 +/* Shapelib read up to 11 characters, even if only 10 should normally be used */ +#define XBASE_FLDNAME_LEN_READ 11 +/* On writing, we limit to 10 characters */ +#define XBASE_FLDNAME_LEN_WRITE 10 +/* Normally only 254 characters should be used. We tolerate 255 historically */ +#define XBASE_FLD_MAX_WIDTH 255 + +DBFHandle SHPAPI_CALL + DBFOpen( const char * pszDBFFile, const char * pszAccess ); +DBFHandle SHPAPI_CALL + DBFOpenLL( const char * pszDBFFile, const char * pszAccess, + SAHooks *psHooks ); +DBFHandle SHPAPI_CALL + DBFCreate( const char * pszDBFFile ); +DBFHandle SHPAPI_CALL + DBFCreateEx( const char * pszDBFFile, const char * pszCodePage ); +DBFHandle SHPAPI_CALL + DBFCreateLL( const char * pszDBFFile, const char * pszCodePage, SAHooks *psHooks ); + +int SHPAPI_CALL + DBFGetFieldCount( DBFHandle psDBF ); +int SHPAPI_CALL + DBFGetRecordCount( DBFHandle psDBF ); +int SHPAPI_CALL + DBFAddField( DBFHandle hDBF, const char * pszFieldName, + DBFFieldType eType, int nWidth, int nDecimals ); + +int SHPAPI_CALL + DBFAddNativeFieldType( DBFHandle hDBF, const char * pszFieldName, + char chType, int nWidth, int nDecimals ); + +int SHPAPI_CALL + DBFDeleteField( DBFHandle hDBF, int iField ); + +int SHPAPI_CALL + DBFReorderFields( DBFHandle psDBF, int* panMap ); + +int SHPAPI_CALL + DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName, + char chType, int nWidth, int nDecimals ); + +DBFFieldType SHPAPI_CALL + DBFGetFieldInfo( DBFHandle psDBF, int iField, + char * pszFieldName, int * pnWidth, int * pnDecimals ); + +int SHPAPI_CALL + DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName); + +int SHPAPI_CALL + DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField ); +double SHPAPI_CALL + DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField ); +const char SHPAPI_CALL1(*) + DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField ); +const char SHPAPI_CALL1(*) + DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField ); +int SHPAPI_CALL + DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField ); + +int SHPAPI_CALL + DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField, + int nFieldValue ); +int SHPAPI_CALL + DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField, + double dFieldValue ); +int SHPAPI_CALL + DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField, + const char * pszFieldValue ); +int SHPAPI_CALL + DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField ); + +int SHPAPI_CALL + DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField, + const char lFieldValue); +int SHPAPI_CALL + DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, + void * pValue ); +const char SHPAPI_CALL1(*) + DBFReadTuple(DBFHandle psDBF, int hEntity ); +int SHPAPI_CALL + DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ); + +int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ); +int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, + int bIsDeleted ); + +DBFHandle SHPAPI_CALL + DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ); + +void SHPAPI_CALL + DBFClose( DBFHandle hDBF ); +void SHPAPI_CALL + DBFUpdateHeader( DBFHandle hDBF ); +char SHPAPI_CALL + DBFGetNativeFieldType( DBFHandle hDBF, int iField ); + +const char SHPAPI_CALL1(*) + DBFGetCodePage(DBFHandle psDBF ); + +void SHPAPI_CALL + DBFSetLastModifiedDate( DBFHandle psDBF, int nYYSince1900, int nMM, int nDD ); + +void SHPAPI_CALL DBFSetWriteEndOfFileChar( DBFHandle psDBF, int bWriteFlag ); + +#ifdef __cplusplus +} +#endif + +#endif /* ndef SHAPEFILE_H_INCLUDED */ diff --git a/support/ShapeLib/shapelib.lib b/support/ShapeLib/shapelib.lib new file mode 100644 index 00000000..5c32f601 Binary files /dev/null and b/support/ShapeLib/shapelib.lib differ diff --git a/support/ShapeLib/shapelib.pc.in b/support/ShapeLib/shapelib.pc.in new file mode 100644 index 00000000..99f00342 --- /dev/null +++ b/support/ShapeLib/shapelib.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +datarootdir=@datarootdir@ +datadir=@datadir@ +includedir=@includedir@ + +Name: shapelib +Description: C API for processing ESRI Shapefiles +Version: @VERSION@ +Libs.private: @PROJ_LIBS@ +Cflags.private: @PROJ_CFLAGS@ +Libs: -L${libdir} -lshp +Cflags: -I${includedir} diff --git a/support/ShapeLib/shapelib_i.exp b/support/ShapeLib/shapelib_i.exp new file mode 100644 index 00000000..6fe452be Binary files /dev/null and b/support/ShapeLib/shapelib_i.exp differ diff --git a/support/ShapeLib/shapelib_i.lib b/support/ShapeLib/shapelib_i.lib new file mode 100644 index 00000000..2d33119d Binary files /dev/null and b/support/ShapeLib/shapelib_i.lib differ diff --git a/support/ShapeLib/shpadd.c b/support/ShapeLib/shpadd.c new file mode 100644 index 00000000..d18957ce --- /dev/null +++ b/support/ShapeLib/shpadd.c @@ -0,0 +1,241 @@ +/****************************************************************************** + * $Id: shpadd.c,v 1.18 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for adding a shape to a shapefile. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: shpadd.c,v $ + * Revision 1.18 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.17 2016-12-04 15:30:15 erouault + * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with + * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo + * structures extended with new members. New functions: + * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, + * SHPSetFastModeReadObject + * + * * sbnsearch.c: new file to implement original ESRI .sbn spatial + * index reading. (no write support). New functions: + * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, + * SBNSearchDiskTreeInteger, SBNSearchFreeIds + * + * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates + * with new file and symbols. + * + * * commit: helper script to cvs commit + * + * Revision 1.16 2010-06-21 20:41:52 fwarmerdam + * reformat white space + * + * Revision 1.15 2007-12-30 16:57:32 fwarmerdam + * add support for z and m + * + * Revision 1.14 2004/09/26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.13 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.12 2001/05/31 19:35:29 warmerda + * added support for writing null shapes + * + * Revision 1.11 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.10 2000/05/24 15:09:22 warmerda + * Added logic to graw vertex lists of needed. + * + * Revision 1.9 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.8 1998/12/03 16:36:26 warmerda + * Use r+b rather than rb+ for binary access. + * + * Revision 1.7 1998/11/09 20:57:04 warmerda + * Fixed SHPGetInfo() call. + * + * Revision 1.6 1998/11/09 20:19:16 warmerda + * Changed to use SHPObject based API. + * + * Revision 1.5 1997/03/06 14:05:02 warmerda + * fixed typo. + * + * Revision 1.4 1997/03/06 14:01:16 warmerda + * added memory allocation checking, and free()s. + * + * Revision 1.3 1995/10/21 03:14:37 warmerda + * Changed to use binary file access + * + * Revision 1.2 1995/08/04 03:18:01 warmerda + * Added header. + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: shpadd.c,v 1.18 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP; + int nShapeType, nVertices, nParts, *panParts, i, nVMax; + double *padfX, *padfY, *padfZ = NULL, *padfM = NULL; + SHPObject *psObject; + const char *tuple = ""; + const char *filename; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc < 2 ) + { + printf( "shpadd shp_file [[x y] [+]]*\n" ); + printf( " or\n" ); + printf( "shpadd shp_file -m [[x y m] [+]]*\n" ); + printf( " or\n" ); + printf( "shpadd shp_file -z [[x y z] [+]]*\n" ); + printf( " or\n" ); + printf( "shpadd shp_file -zm [[x y z m] [+]]*\n" ); + exit( 1 ); + } + + filename = argv[1]; + argv++; + argc--; + +/* -------------------------------------------------------------------- */ +/* Check for tuple description options. */ +/* -------------------------------------------------------------------- */ + if( argc > 1 + && (strcmp(argv[1],"-z") == 0 + || strcmp(argv[1],"-m") == 0 + || strcmp(argv[1],"-zm") == 0) ) + { + tuple = argv[1] + 1; + argv++; + argc--; + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( filename, "r+b" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", filename ); + exit( 1 ); + } + + SHPGetInfo( hSHP, NULL, &nShapeType, NULL, NULL ); + + if( argc == 1 ) + nShapeType = SHPT_NULL; + +/* -------------------------------------------------------------------- */ +/* Build a vertex/part list from the command line arguments. */ +/* -------------------------------------------------------------------- */ + nVMax = 1000; + padfX = (double *) malloc(sizeof(double) * nVMax); + padfY = (double *) malloc(sizeof(double) * nVMax); + + if( strchr(tuple,'z') ) + padfZ = (double *) malloc(sizeof(double) * nVMax); + if( strchr(tuple,'m') ) + padfM = (double *) malloc(sizeof(double) * nVMax); + + nVertices = 0; + + if( (panParts = (int *) malloc(sizeof(int) * 1000 )) == NULL ) + { + printf( "Out of memory\n" ); + exit( 1 ); + } + + nParts = 1; + panParts[0] = 0; + + for( i = 1; i < argc; ) + { + if( argv[i][0] == '+' ) + { + panParts[nParts++] = nVertices; + i++; + } + else if( i < argc-1-(int)strlen(tuple) ) + { + if( nVertices == nVMax ) + { + nVMax = nVMax * 2; + padfX = (double *) realloc(padfX,sizeof(double)*nVMax); + padfY = (double *) realloc(padfY,sizeof(double)*nVMax); + if( padfZ ) + padfZ = (double *) realloc(padfZ,sizeof(double)*nVMax); + if( padfM ) + padfM = (double *) realloc(padfM,sizeof(double)*nVMax); + } + + sscanf( argv[i++], "%lg", padfX+nVertices ); + sscanf( argv[i++], "%lg", padfY+nVertices ); + if( padfZ ) + sscanf( argv[i++], "%lg", padfZ+nVertices ); + if( padfM ) + sscanf( argv[i++], "%lg", padfM+nVertices ); + + nVertices += 1; + } + } + +/* -------------------------------------------------------------------- */ +/* Write the new entity to the shape file. */ +/* -------------------------------------------------------------------- */ + psObject = SHPCreateObject( nShapeType, -1, nParts, panParts, NULL, + nVertices, padfX, padfY, padfZ, padfM ); + SHPWriteObject( hSHP, -1, psObject ); + SHPDestroyObject( psObject ); + + SHPClose( hSHP ); + + free( panParts ); + free( padfX ); + free( padfY ); + free( padfZ ); + free( padfM ); + + return 0; +} diff --git a/support/ShapeLib/shpcreate.c b/support/ShapeLib/shpcreate.c new file mode 100644 index 00000000..69ec267b --- /dev/null +++ b/support/ShapeLib/shpcreate.c @@ -0,0 +1,135 @@ +/****************************************************************************** + * $Id: shpcreate.c,v 1.9 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for creating a new shapefile. + * Author: Frank Warmerdam, warmerdm@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: shpcreate.c,v $ + * Revision 1.9 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.8 2007-12-30 16:57:33 fwarmerdam + * add support for z and m + * + * Revision 1.7 2004/09/26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.6 2004/01/09 16:39:49 fwarmerdam + * include standard include files + * + * Revision 1.5 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.4 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.3 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.2 1995/08/04 03:16:43 warmerda + * Added header. + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: shpcreate.c,v 1.9 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP; + int nShapeType; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 3 ) + { + printf( "shpcreate shp_file [point/arc/polygon/multipoint][/m/z]\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Figure out the shape type. */ +/* -------------------------------------------------------------------- */ + if( strcmp(argv[2],"POINT") == 0 || strcmp(argv[2],"point") == 0 ) + nShapeType = SHPT_POINT; + else if( strcmp(argv[2],"ARC") == 0 || strcmp(argv[2],"arc") == 0 ) + nShapeType = SHPT_ARC; + else if( strcmp(argv[2],"POLYGON") == 0 || strcmp(argv[2],"polygon") == 0 ) + nShapeType = SHPT_POLYGON; + else if( strcmp(argv[2],"MULTIPOINT")==0 ||strcmp(argv[2],"multipoint")==0) + nShapeType = SHPT_MULTIPOINT; + else if( strcmp(argv[2],"POINTZ") == 0 || strcmp(argv[2],"pointz") == 0 ) + nShapeType = SHPT_POINTZ; + else if( strcmp(argv[2],"ARCZ") == 0 || strcmp(argv[2],"arcz") == 0 ) + nShapeType = SHPT_ARCZ; + else if( strcmp(argv[2],"POLYGONZ") == 0 || strcmp(argv[2],"polygonz") == 0) + nShapeType = SHPT_POLYGONZ; + else if( strcmp(argv[2],"MULTIPOINTZ") == 0 + || strcmp(argv[2],"multipointz") == 0) + nShapeType = SHPT_MULTIPOINTZ; + else if( strcmp(argv[2],"POINTM") == 0 || strcmp(argv[2],"pointm") == 0 ) + nShapeType = SHPT_POINTM; + else if( strcmp(argv[2],"ARCM") == 0 || strcmp(argv[2],"arcm") == 0 ) + nShapeType = SHPT_ARCM; + else if( strcmp(argv[2],"POLYGONM") == 0 || strcmp(argv[2],"polygonm") == 0) + nShapeType = SHPT_POLYGONM; + else if( strcmp(argv[2],"MULTIPOINTM") == 0 + || strcmp(argv[2],"multipointm") == 0 ) + nShapeType = SHPT_MULTIPOINTM; + else + { + printf( "Shape Type `%s' not recognised.\n", argv[2] ); + exit( 2 ); + } + +/* -------------------------------------------------------------------- */ +/* Create the requested layer. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPCreate( argv[1], nShapeType ); + + if( hSHP == NULL ) + { + printf( "Unable to create:%s\n", argv[1] ); + exit( 3 ); + } + + SHPClose( hSHP ); + + return 0; +} diff --git a/support/ShapeLib/shpdump.c b/support/ShapeLib/shpdump.c new file mode 100644 index 00000000..d0f2ec5e --- /dev/null +++ b/support/ShapeLib/shpdump.c @@ -0,0 +1,284 @@ +/****************************************************************************** + * $Id: shpdump.c,v 1.19 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for dumping contents of a shapefile to + * the terminal in human readable form. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: shpdump.c,v $ + * Revision 1.19 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.18 2011-07-24 03:05:14 fwarmerdam + * use %.15g for formatting coordiantes in shpdump + * + * Revision 1.17 2010-07-01 07:33:04 fwarmerdam + * do not crash in shpdump if null object returned + * + * Revision 1.16 2010-07-01 07:27:13 fwarmerdam + * white space formatting adjustments + * + * Revision 1.15 2006-01-26 15:07:32 fwarmerdam + * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 + * + * Revision 1.14 2005/02/11 17:17:46 fwarmerdam + * added panPartStart[0] validation + * + * Revision 1.13 2004/09/26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.12 2004/01/27 18:05:35 fwarmerdam + * Added the -ho (header only) switch. + * + * Revision 1.11 2004/01/09 16:39:49 fwarmerdam + * include standard include files + * + * Revision 1.10 2002/04/10 16:59:29 warmerda + * added -validate switch + * + * Revision 1.9 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.8 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.7 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.6 1998/12/03 15:48:48 warmerda + * Added report of shapefile type, and total number of shapes. + * + * Revision 1.5 1998/11/09 20:57:36 warmerda + * use SHPObject. + * + * Revision 1.4 1995/10/21 03:14:49 warmerda + * Changed to use binary file access. + * + * Revision 1.3 1995/08/23 02:25:25 warmerda + * Added support for bounds. + * + * Revision 1.2 1995/08/04 03:18:11 warmerda + * Added header. + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: shpdump.c,v 1.19 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP; + int nShapeType, nEntities, i, iPart, bValidate = 0,nInvalidCount=0; + int bHeaderOnly = 0; + const char *pszPlus; + double adfMinBound[4], adfMaxBound[4]; + int nPrecision = 15; + + if( argc > 1 && strcmp(argv[1],"-validate") == 0 ) + { + bValidate = 1; + argv++; + argc--; + } + + if( argc > 1 && strcmp(argv[1],"-ho") == 0 ) + { + bHeaderOnly = 1; + argv++; + argc--; + } + + if( argc > 2 && strcmp(argv[1],"-precision") == 0 ) + { + nPrecision = atoi(argv[2]); + argv+=2; + argc-=2; + } + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 2 ) + { + printf( "shpdump [-validate] [-ho] [-precision number] shp_file\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( argv[1], "rb" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[1] ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Print out the file bounds. */ +/* -------------------------------------------------------------------- */ + SHPGetInfo( hSHP, &nEntities, &nShapeType, adfMinBound, adfMaxBound ); + + printf( "Shapefile Type: %s # of Shapes: %d\n\n", + SHPTypeName( nShapeType ), nEntities ); + + printf( "File Bounds: (%.*g,%.*g,%.*g,%.*g)\n" + " to (%.*g,%.*g,%.*g,%.*g)\n", + nPrecision, adfMinBound[0], + nPrecision, adfMinBound[1], + nPrecision, adfMinBound[2], + nPrecision, adfMinBound[3], + nPrecision, adfMaxBound[0], + nPrecision, adfMaxBound[1], + nPrecision, adfMaxBound[2], + nPrecision, adfMaxBound[3] ); + +/* -------------------------------------------------------------------- */ +/* Skim over the list of shapes, printing all the vertices. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < nEntities && !bHeaderOnly; i++ ) + { + int j; + SHPObject *psShape; + + psShape = SHPReadObject( hSHP, i ); + + if( psShape == NULL ) + { + fprintf( stderr, + "Unable to read shape %d, terminating object reading.\n", + i ); + break; + } + + if( psShape->bMeasureIsUsed ) + printf( "\nShape:%d (%s) nVertices=%d, nParts=%d\n" + " Bounds:(%.*g,%.*g, %.*g, %.*g)\n" + " to (%.*g,%.*g, %.*g, %.*g)\n", + i, SHPTypeName(psShape->nSHPType), + psShape->nVertices, psShape->nParts, + nPrecision, psShape->dfXMin, + nPrecision, psShape->dfYMin, + nPrecision, psShape->dfZMin, + nPrecision, psShape->dfMMin, + nPrecision, psShape->dfXMax, + nPrecision, psShape->dfYMax, + nPrecision, psShape->dfZMax, + nPrecision, psShape->dfMMax ); + else + printf( "\nShape:%d (%s) nVertices=%d, nParts=%d\n" + " Bounds:(%.*g,%.*g, %.*g)\n" + " to (%.*g,%.*g, %.*g)\n", + i, SHPTypeName(psShape->nSHPType), + psShape->nVertices, psShape->nParts, + nPrecision, psShape->dfXMin, + nPrecision, psShape->dfYMin, + nPrecision, psShape->dfZMin, + nPrecision, psShape->dfXMax, + nPrecision, psShape->dfYMax, + nPrecision, psShape->dfZMax ); + + if( psShape->nParts > 0 && psShape->panPartStart[0] != 0 ) + { + fprintf( stderr, "panPartStart[0] = %d, not zero as expected.\n", + psShape->panPartStart[0] ); + } + + for( j = 0, iPart = 1; j < psShape->nVertices; j++ ) + { + const char *pszPartType = ""; + + if( j == 0 && psShape->nParts > 0 ) + pszPartType = SHPPartTypeName( psShape->panPartType[0] ); + + if( iPart < psShape->nParts + && psShape->panPartStart[iPart] == j ) + { + pszPartType = SHPPartTypeName( psShape->panPartType[iPart] ); + iPart++; + pszPlus = "+"; + } + else + pszPlus = " "; + + if( psShape->bMeasureIsUsed ) + printf(" %s (%.*g,%.*g, %.*g, %.*g) %s \n", + pszPlus, + nPrecision, psShape->padfX[j], + nPrecision, psShape->padfY[j], + nPrecision, psShape->padfZ[j], + nPrecision, psShape->padfM[j], + pszPartType ); + else + printf(" %s (%.*g,%.*g, %.*g) %s \n", + pszPlus, + nPrecision, psShape->padfX[j], + nPrecision, psShape->padfY[j], + nPrecision, psShape->padfZ[j], + pszPartType ); + } + + if( bValidate ) + { + int nAltered = SHPRewindObject( hSHP, psShape ); + + if( nAltered > 0 ) + { + printf( " %d rings wound in the wrong direction.\n", + nAltered ); + nInvalidCount++; + } + } + + SHPDestroyObject( psShape ); + } + + SHPClose( hSHP ); + + if( bValidate ) + { + printf( "%d object has invalid ring orderings.\n", nInvalidCount ); + } + +#ifdef USE_DBMALLOC + malloc_dump(2); +#endif + + exit( 0 ); +} diff --git a/support/ShapeLib/shpopen.c b/support/ShapeLib/shpopen.c new file mode 100644 index 00000000..457c3d55 --- /dev/null +++ b/support/ShapeLib/shpopen.c @@ -0,0 +1,3050 @@ +/****************************************************************************** + * $Id: shpopen.c 40020 2017-09-07 11:41:25Z rouault $ + * + * Project: Shapelib + * Purpose: Implementation of core Shapefile read/write functions. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, 2001, Frank Warmerdam + * Copyright (c) 2011-2013, Even Rouault + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: shpopen.c,v $ + * Revision 1.75 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.74 2016-12-04 15:30:15 erouault + * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with + * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo + * structures extended with new members. New functions: + * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, + * SHPSetFastModeReadObject + * + * * sbnsearch.c: new file to implement original ESRI .sbn spatial + * index reading. (no write support). New functions: + * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, + * SBNSearchDiskTreeInteger, SBNSearchFreeIds + * + * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates + * with new file and symbols. + * + * * commit: helper script to cvs commit + * + * Revision 1.73 2012-01-24 22:33:01 fwarmerdam + * fix memory leak on failure to open .shp (gdal #4410) + * + * Revision 1.72 2011-12-11 22:45:28 fwarmerdam + * fix failure return from SHPOpenLL. + * + * Revision 1.71 2011-09-15 03:33:58 fwarmerdam + * fix missing cast (#2344) + * + * Revision 1.70 2011-07-24 05:59:25 fwarmerdam + * minimize use of CPLError in favor of SAHooks.Error() + * + * Revision 1.69 2011-07-24 03:24:22 fwarmerdam + * fix memory leaks in error cases creating shapefiles (#2061) + * + * Revision 1.68 2010-08-27 23:42:52 fwarmerdam + * add SHPAPI_CALL attribute in code + * + * Revision 1.67 2010-07-01 08:15:48 fwarmerdam + * do not error out on an object with zero vertices + * + * Revision 1.66 2010-07-01 07:58:57 fwarmerdam + * minor cleanup of error handling + * + * Revision 1.65 2010-07-01 07:27:13 fwarmerdam + * white space formatting adjustments + * + * Revision 1.64 2010-01-28 11:34:34 fwarmerdam + * handle the shape file length limits more gracefully (#3236) + * + * Revision 1.63 2010-01-28 04:04:40 fwarmerdam + * improve numerical accuracy of SHPRewind() algs (gdal #3363) + * + * Revision 1.62 2010-01-17 05:34:13 fwarmerdam + * Remove asserts on x/y being null (#2148). + * + * Revision 1.61 2010-01-16 05:07:42 fwarmerdam + * allow 0/nulls in shpcreateobject (#2148) + * + * Revision 1.60 2009-09-17 20:50:02 bram + * on Win32, define snprintf as alias to _snprintf + * + * Revision 1.59 2008-03-14 05:25:31 fwarmerdam + * Correct crash on buggy geometries (gdal #2218) + * + * Revision 1.58 2008/01/08 23:28:26 bram + * on line 2095, use a float instead of a double to avoid a compiler warning + * + * Revision 1.57 2007/12/06 07:00:25 fwarmerdam + * dbfopen now using SAHooks for fileio + * + * Revision 1.56 2007/12/04 20:37:56 fwarmerdam + * preliminary implementation of hooks api for io and errors + * + * Revision 1.55 2007/11/21 22:39:56 fwarmerdam + * close shx file in readonly mode (GDAL #1956) + * + * Revision 1.54 2007/11/15 00:12:47 mloskot + * Backported recent changes from GDAL (Ticket #1415) to Shapelib. + * + * Revision 1.53 2007/11/14 22:31:08 fwarmerdam + * checks after mallocs to detect for corrupted/voluntary broken shapefiles. + * http://trac.osgeo.org/gdal/ticket/1991 + * + * Revision 1.52 2007/06/21 15:58:33 fwarmerdam + * fix for SHPRewindObject when rings touch at one vertex (gdal #976) + * + * Revision 1.51 2006/09/04 15:24:01 fwarmerdam + * Fixed up log message for 1.49. + * + * Revision 1.50 2006/09/04 15:21:39 fwarmerdam + * fix of last fix + * + * Revision 1.49 2006/09/04 15:21:00 fwarmerdam + * MLoskot: Added stronger test of Shapefile reading failures, e.g. truncated + * files. The problem was discovered by Tim Sutton and reported here + * https://svn.qgis.org/trac/ticket/200 + * + * Revision 1.48 2006/01/26 15:07:32 fwarmerdam + * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 + * + * Revision 1.47 2006/01/04 20:07:23 fwarmerdam + * In SHPWriteObject() make sure that the record length is updated + * when rewriting an existing record. + * + * Revision 1.46 2005/02/11 17:17:46 fwarmerdam + * added panPartStart[0] validation + * + * Revision 1.45 2004/09/26 20:09:48 fwarmerdam + * const correctness changes + * + * Revision 1.44 2003/12/29 00:18:39 fwarmerdam + * added error checking for failed IO and optional CPL error reporting + * + * Revision 1.43 2003/12/01 16:20:08 warmerda + * be careful of zero vertex shapes + * + * Revision 1.42 2003/12/01 14:58:27 warmerda + * added degenerate object check in SHPRewindObject() + * + * Revision 1.41 2003/07/08 15:22:43 warmerda + * avoid warning + * + * Revision 1.40 2003/04/21 18:30:37 warmerda + * added header write/update public methods + * + * Revision 1.39 2002/08/26 06:46:56 warmerda + * avoid c++ comments + * + * Revision 1.38 2002/05/07 16:43:39 warmerda + * Removed debugging printf() + * + * Revision 1.37 2002/04/10 17:35:22 warmerda + * fixed bug in ring reversal code + * + * Revision 1.36 2002/04/10 16:59:54 warmerda + * added SHPRewindObject + * + * Revision 1.35 2001/12/07 15:10:44 warmerda + * fix if .shx fails to open + * + * Revision 1.34 2001/11/01 16:29:55 warmerda + * move pabyRec into SHPInfo for thread safety + * + * Revision 1.33 2001/07/03 12:18:15 warmerda + * Improved cleanup if SHX not found, provided by Riccardo Cohen. + * + * Revision 1.32 2001/06/22 01:58:07 warmerda + * be more careful about establishing initial bounds in face of NULL shapes + * + * Revision 1.31 2001/05/31 19:35:29 warmerda + * added support for writing null shapes + * + * Revision 1.30 2001/05/28 12:46:29 warmerda + * Add some checking on reasonableness of record count when opening. + * + * Revision 1.29 2001/05/23 13:36:52 warmerda + * added use of SHPAPI_CALL + * + * Revision 1.28 2001/02/06 22:25:06 warmerda + * fixed memory leaks when SHPOpen() fails + * + * Revision 1.27 2000/07/18 15:21:33 warmerda + * added better enforcement of -1 for append in SHPWriteObject + * + * Revision 1.26 2000/02/16 16:03:51 warmerda + * added null shape support + * + * Revision 1.25 1999/12/15 13:47:07 warmerda + * Fixed record size settings in .shp file (was 4 words too long) + * Added stdlib.h. + * + * Revision 1.24 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.23 1999/07/27 00:53:46 warmerda + * added support for rewriting shapes + * + * Revision 1.22 1999/06/11 19:19:11 warmerda + * Cleanup pabyRec static buffer on SHPClose(). + * + * Revision 1.21 1999/06/02 14:57:56 kshih + * Remove unused variables + * + * Revision 1.20 1999/04/19 21:04:17 warmerda + * Fixed syntax error. + * + * Revision 1.19 1999/04/19 21:01:57 warmerda + * Force access string to binary in SHPOpen(). + * + * Revision 1.18 1999/04/01 18:48:07 warmerda + * Try upper case extensions if lower case doesn't work. + * + * Revision 1.17 1998/12/31 15:29:39 warmerda + * Disable writing measure values to multipatch objects if + * DISABLE_MULTIPATCH_MEASURE is defined. + * + * Revision 1.16 1998/12/16 05:14:33 warmerda + * Added support to write MULTIPATCH. Fixed reading Z coordinate of + * MULTIPATCH. Fixed record size written for all feature types. + * + * Revision 1.15 1998/12/03 16:35:29 warmerda + * r+b is proper binary access string, not rb+. + * + * Revision 1.14 1998/12/03 15:47:56 warmerda + * Fixed setting of nVertices in SHPCreateObject(). + * + * Revision 1.13 1998/12/03 15:33:54 warmerda + * Made SHPCalculateExtents() separately callable. + * + * Revision 1.12 1998/11/11 20:01:50 warmerda + * Fixed bug writing ArcM/Z, and PolygonM/Z for big endian machines. + * + * Revision 1.11 1998/11/09 20:56:44 warmerda + * Fixed up handling of file wide bounds. + * + * Revision 1.10 1998/11/09 20:18:51 warmerda + * Converted to support 3D shapefiles, and use of SHPObject. + * + * Revision 1.9 1998/02/24 15:09:05 warmerda + * Fixed memory leak. + * + * Revision 1.8 1997/12/04 15:40:29 warmerda + * Fixed byte swapping of record number, and record length fields in the + * .shp file. + * + * Revision 1.7 1995/10/21 03:15:58 warmerda + * Added support for binary file access, the magic cookie 9997 + * and tried to improve the int32 selection logic for 16bit systems. + * + * Revision 1.6 1995/09/04 04:19:41 warmerda + * Added fix for file bounds. + * + * Revision 1.5 1995/08/25 15:16:44 warmerda + * Fixed a couple of problems with big endian systems ... one with bounds + * and the other with multipart polygons. + * + * Revision 1.4 1995/08/24 18:10:17 warmerda + * Switch to use SfRealloc() to avoid problems with pre-ANSI realloc() + * functions (such as on the Sun). + * + * Revision 1.3 1995/08/23 02:23:15 warmerda + * Added support for reading bounds, and fixed up problems in setting the + * file wide bounds. + * + * Revision 1.2 1995/08/04 03:16:57 warmerda + * Added header. + * + */ + +#include "shapefil.h" + +#include +#include +#include +#include +#include +#include +#include + +SHP_CVSID("$Id: shpopen.c 40020 2017-09-07 11:41:25Z rouault $") + +typedef unsigned char uchar; + +#if UINT_MAX == 65535 +typedef unsigned long int32; +#else +typedef unsigned int int32; +#endif + +#ifndef FALSE +# define FALSE 0 +# define TRUE 1 +#endif + +#define ByteCopy( a, b, c ) memcpy( b, a, c ) +#ifndef MAX +# define MIN(a,b) ((ab) ? a : b) +#endif + +#ifndef USE_CPL +#if defined(_MSC_VER) +# if _MSC_VER < 1900 +# define snprintf _snprintf +# endif +#elif defined(WIN32) || defined(_WIN32) +# ifndef snprintf +# define snprintf _snprintf +# endif +#endif +#endif + +#ifndef CPL_UNUSED +#if defined(__GNUC__) && __GNUC__ >= 4 +# define CPL_UNUSED __attribute((__unused__)) +#else +# define CPL_UNUSED +#endif +#endif + +#if defined(CPL_LSB) +#define bBigEndian FALSE +#elif defined(CPL_MSB) +#define bBigEndian TRUE +#else +static int bBigEndian; +#endif + +/************************************************************************/ +/* SwapWord() */ +/* */ +/* Swap a 2, 4 or 8 byte word. */ +/************************************************************************/ + +static void SwapWord( int length, void * wordP ) + +{ + int i; + uchar temp; + + for( i=0; i < length/2; i++ ) + { + temp = ((uchar *) wordP)[i]; + ((uchar *)wordP)[i] = ((uchar *) wordP)[length-i-1]; + ((uchar *) wordP)[length-i-1] = temp; + } +} + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ + +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + +/************************************************************************/ +/* SHPWriteHeader() */ +/* */ +/* Write out a header for the .shp and .shx files as well as the */ +/* contents of the index (.shx) file. */ +/************************************************************************/ + +void SHPAPI_CALL SHPWriteHeader( SHPHandle psSHP ) + +{ + uchar abyHeader[100] = { 0 }; + int i; + int32 i32; + double dValue; + int32 *panSHX; + + if (psSHP->fpSHX == NULL) + { + psSHP->sHooks.Error( "SHPWriteHeader failed : SHX file is closed"); + return; + } + +/* -------------------------------------------------------------------- */ +/* Prepare header block for .shp file. */ +/* -------------------------------------------------------------------- */ + + abyHeader[2] = 0x27; /* magic cookie */ + abyHeader[3] = 0x0a; + + i32 = psSHP->nFileSize/2; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + i32 = 1000; /* version */ + ByteCopy( &i32, abyHeader+28, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+28 ); + + i32 = psSHP->nShapeType; /* shape type */ + ByteCopy( &i32, abyHeader+32, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+32 ); + + dValue = psSHP->adBoundsMin[0]; /* set bounds */ + ByteCopy( &dValue, abyHeader+36, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+36 ); + + dValue = psSHP->adBoundsMin[1]; + ByteCopy( &dValue, abyHeader+44, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+44 ); + + dValue = psSHP->adBoundsMax[0]; + ByteCopy( &dValue, abyHeader+52, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+52 ); + + dValue = psSHP->adBoundsMax[1]; + ByteCopy( &dValue, abyHeader+60, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+60 ); + + dValue = psSHP->adBoundsMin[2]; /* z */ + ByteCopy( &dValue, abyHeader+68, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+68 ); + + dValue = psSHP->adBoundsMax[2]; + ByteCopy( &dValue, abyHeader+76, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+76 ); + + dValue = psSHP->adBoundsMin[3]; /* m */ + ByteCopy( &dValue, abyHeader+84, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+84 ); + + dValue = psSHP->adBoundsMax[3]; + ByteCopy( &dValue, abyHeader+92, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+92 ); + +/* -------------------------------------------------------------------- */ +/* Write .shp file header. */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 0 ) != 0 + || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHP ) != 1 ) + { + char szError[200]; + + snprintf( szError, sizeof(szError), + "Failure writing .shp header: %s", strerror(errno) ); + psSHP->sHooks.Error( szError ); + return; + } + +/* -------------------------------------------------------------------- */ +/* Prepare, and write .shx file header. */ +/* -------------------------------------------------------------------- */ + i32 = (psSHP->nRecords * 2 * sizeof(int32) + 100)/2; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + if( psSHP->sHooks.FSeek( psSHP->fpSHX, 0, 0 ) != 0 + || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHX ) != 1 ) + { + char szError[200]; + + snprintf( szError, sizeof(szError), + "Failure writing .shx header: %s", strerror(errno) ); + psSHP->sHooks.Error( szError ); + + return; + } + +/* -------------------------------------------------------------------- */ +/* Write out the .shx contents. */ +/* -------------------------------------------------------------------- */ + panSHX = (int32 *) malloc(sizeof(int32) * 2 * psSHP->nRecords); + if( panSHX == NULL ) + { + psSHP->sHooks.Error( "Failure allocatin panSHX" ); + return; + } + + for( i = 0; i < psSHP->nRecords; i++ ) + { + panSHX[i*2 ] = psSHP->panRecOffset[i]/2; + panSHX[i*2+1] = psSHP->panRecSize[i]/2; + if( !bBigEndian ) SwapWord( 4, panSHX+i*2 ); + if( !bBigEndian ) SwapWord( 4, panSHX+i*2+1 ); + } + + if( (int)psSHP->sHooks.FWrite( panSHX, sizeof(int32)*2, psSHP->nRecords, psSHP->fpSHX ) + != psSHP->nRecords ) + { + char szError[200]; + + snprintf( szError, sizeof(szError), + "Failure writing .shx contents: %s", strerror(errno) ); + psSHP->sHooks.Error( szError ); + } + + free( panSHX ); + +/* -------------------------------------------------------------------- */ +/* Flush to disk. */ +/* -------------------------------------------------------------------- */ + psSHP->sHooks.FFlush( psSHP->fpSHP ); + psSHP->sHooks.FFlush( psSHP->fpSHX ); +} + +/************************************************************************/ +/* SHPOpen() */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPOpen( const char * pszLayer, const char * pszAccess ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return SHPOpenLL( pszLayer, pszAccess, &sHooks ); +} + +/************************************************************************/ +/* SHPOpen() */ +/* */ +/* Open the .shp and .shx files based on the basename of the */ +/* files or either file name. */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) + +{ + char *pszFullname, *pszBasename; + SHPHandle psSHP; + + uchar *pabyBuf; + int i; + double dValue; + int bLazySHXLoading = FALSE; + size_t nFullnameLen; + +/* -------------------------------------------------------------------- */ +/* Ensure the access string is one of the legal ones. We */ +/* ensure the result string indicates binary to avoid common */ +/* problems on Windows. */ +/* -------------------------------------------------------------------- */ + if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0 + || strcmp(pszAccess,"r+") == 0 ) + pszAccess = "r+b"; + else + { + bLazySHXLoading = strchr(pszAccess, 'l') != NULL; + pszAccess = "rb"; + } + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this machine. */ +/* -------------------------------------------------------------------- */ +#if !defined(bBigEndian) + i = 1; + if( *((uchar *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; +#endif + +/* -------------------------------------------------------------------- */ +/* Initialize the info structure. */ +/* -------------------------------------------------------------------- */ + psSHP = (SHPHandle) calloc(sizeof(SHPInfo),1); + + psSHP->bUpdated = FALSE; + memcpy( &(psSHP->sHooks), psHooks, sizeof(SAHooks) ); + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszLayer)+5); + strcpy( pszBasename, pszLayer ); + for( i = (int)strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + +/* -------------------------------------------------------------------- */ +/* Open the .shp and .shx files. Note that files pulled from */ +/* a PC to Unix with upper case filenames won't work! */ +/* -------------------------------------------------------------------- */ + nFullnameLen = strlen(pszBasename) + 5; + pszFullname = (char *) malloc(nFullnameLen); + snprintf( pszFullname, nFullnameLen, "%s.shp", pszBasename ) ; + psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + if( psSHP->fpSHP == NULL ) + { + snprintf( pszFullname, nFullnameLen, "%s.SHP", pszBasename ); + psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + } + + if( psSHP->fpSHP == NULL ) + { + size_t nMessageLen = strlen(pszBasename)*2+256; + char *pszMessage = (char *) malloc(nMessageLen); + snprintf( pszMessage, nMessageLen, "Unable to open %s.shp or %s.SHP.", + pszBasename, pszBasename ); + psHooks->Error( pszMessage ); + free( pszMessage ); + + free( psSHP ); + free( pszBasename ); + free( pszFullname ); + + return NULL; + } + + snprintf( pszFullname, nFullnameLen, "%s.shx", pszBasename ); + psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + if( psSHP->fpSHX == NULL ) + { + snprintf( pszFullname, nFullnameLen, "%s.SHX", pszBasename ); + psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + } + + if( psSHP->fpSHX == NULL ) + { + size_t nMessageLen = strlen(pszBasename)*2+256; + char *pszMessage = (char *) malloc(nMessageLen); + snprintf( pszMessage, nMessageLen, "Unable to open %s.shx or %s.SHX." + "Try --config SHAPE_RESTORE_SHX true to restore or create it", + pszBasename, pszBasename ); + psHooks->Error( pszMessage ); + free( pszMessage ); + + psSHP->sHooks.FClose( psSHP->fpSHP ); + free( psSHP ); + free( pszBasename ); + free( pszFullname ); + return( NULL ); + } + + free( pszFullname ); + free( pszBasename ); + +/* -------------------------------------------------------------------- */ +/* Read the file size from the SHP file. */ +/* -------------------------------------------------------------------- */ + pabyBuf = (uchar *) malloc(100); + psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHP ); + + psSHP->nFileSize = ((unsigned int)pabyBuf[24]<<24)|(pabyBuf[25]<<16)| + (pabyBuf[26]<<8)|pabyBuf[27]; + if( psSHP->nFileSize < 0xFFFFFFFFU / 2 ) + psSHP->nFileSize *= 2; + else + psSHP->nFileSize = 0xFFFFFFFEU; + +/* -------------------------------------------------------------------- */ +/* Read SHX file Header info */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHX ) != 1 + || pabyBuf[0] != 0 + || pabyBuf[1] != 0 + || pabyBuf[2] != 0x27 + || (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d) ) + { + psSHP->sHooks.Error( ".shx file is unreadable, or corrupt." ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + free( psSHP ); + + return( NULL ); + } + + psSHP->nRecords = pabyBuf[27]|(pabyBuf[26]<<8)|(pabyBuf[25]<<16)| + ((pabyBuf[24] & 0x7F)<<24); + psSHP->nRecords = (psSHP->nRecords - 50) / 4; + + psSHP->nShapeType = pabyBuf[32]; + + if( psSHP->nRecords < 0 || psSHP->nRecords > 256000000 ) + { + char szError[200]; + + snprintf( szError, sizeof(szError), + "Record count in .shp header is %d, which seems\n" + "unreasonable. Assuming header is corrupt.", + psSHP->nRecords ); + psSHP->sHooks.Error( szError ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + free( psSHP ); + free(pabyBuf); + + return( NULL ); + } + + /* If a lot of records are advertized, check that the file is big enough */ + /* to hold them */ + if( psSHP->nRecords >= 1024 * 1024 ) + { + SAOffset nFileSize; + psSHP->sHooks.FSeek( psSHP->fpSHX, 0, 2 ); + nFileSize = psSHP->sHooks.FTell( psSHP->fpSHX ); + if( nFileSize > 100 && + nFileSize/2 < (SAOffset)(psSHP->nRecords * 4 + 50) ) + { + psSHP->nRecords = (int)((nFileSize - 100) / 8); + } + psSHP->sHooks.FSeek( psSHP->fpSHX, 100, 0 ); + } + +/* -------------------------------------------------------------------- */ +/* Read the bounds. */ +/* -------------------------------------------------------------------- */ + if( bBigEndian ) SwapWord( 8, pabyBuf+36 ); + memcpy( &dValue, pabyBuf+36, 8 ); + psSHP->adBoundsMin[0] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+44 ); + memcpy( &dValue, pabyBuf+44, 8 ); + psSHP->adBoundsMin[1] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+52 ); + memcpy( &dValue, pabyBuf+52, 8 ); + psSHP->adBoundsMax[0] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+60 ); + memcpy( &dValue, pabyBuf+60, 8 ); + psSHP->adBoundsMax[1] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+68 ); /* z */ + memcpy( &dValue, pabyBuf+68, 8 ); + psSHP->adBoundsMin[2] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+76 ); + memcpy( &dValue, pabyBuf+76, 8 ); + psSHP->adBoundsMax[2] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+84 ); /* z */ + memcpy( &dValue, pabyBuf+84, 8 ); + psSHP->adBoundsMin[3] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+92 ); + memcpy( &dValue, pabyBuf+92, 8 ); + psSHP->adBoundsMax[3] = dValue; + + free( pabyBuf ); + +/* -------------------------------------------------------------------- */ +/* Read the .shx file to get the offsets to each record in */ +/* the .shp file. */ +/* -------------------------------------------------------------------- */ + psSHP->nMaxRecords = psSHP->nRecords; + + psSHP->panRecOffset = (unsigned int *) + malloc(sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) ); + psSHP->panRecSize = (unsigned int *) + malloc(sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) ); + if( bLazySHXLoading ) + pabyBuf = NULL; + else + pabyBuf = (uchar *) malloc(8 * MAX(1,psSHP->nRecords) ); + + if (psSHP->panRecOffset == NULL || + psSHP->panRecSize == NULL || + (!bLazySHXLoading && pabyBuf == NULL)) + { + char szError[200]; + + snprintf( szError, sizeof(szError), + "Not enough memory to allocate requested memory (nRecords=%d).\n" + "Probably broken SHP file", + psSHP->nRecords ); + psSHP->sHooks.Error( szError ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + if (psSHP->panRecOffset) free( psSHP->panRecOffset ); + if (psSHP->panRecSize) free( psSHP->panRecSize ); + if (pabyBuf) free( pabyBuf ); + free( psSHP ); + return( NULL ); + } + + if( bLazySHXLoading ) + { + memset(psSHP->panRecOffset, 0, sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) ); + memset(psSHP->panRecSize, 0, sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) ); + return( psSHP ); + } + + if( (int) psSHP->sHooks.FRead( pabyBuf, 8, psSHP->nRecords, psSHP->fpSHX ) + != psSHP->nRecords ) + { + char szError[200]; + + snprintf( szError, sizeof(szError), + "Failed to read all values for %d records in .shx file: %s.", + psSHP->nRecords, strerror(errno) ); + psSHP->sHooks.Error( szError ); + + /* SHX is short or unreadable for some reason. */ + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + free( psSHP->panRecOffset ); + free( psSHP->panRecSize ); + free( pabyBuf ); + free( psSHP ); + + return( NULL ); + } + + /* In read-only mode, we can close the SHX now */ + if (strcmp(pszAccess, "rb") == 0) + { + psSHP->sHooks.FClose( psSHP->fpSHX ); + psSHP->fpSHX = NULL; + } + + for( i = 0; i < psSHP->nRecords; i++ ) + { + unsigned int nOffset, nLength; + + memcpy( &nOffset, pabyBuf + i * 8, 4 ); + if( !bBigEndian ) SwapWord( 4, &nOffset ); + + memcpy( &nLength, pabyBuf + i * 8 + 4, 4 ); + if( !bBigEndian ) SwapWord( 4, &nLength ); + + if( nOffset > (unsigned int)INT_MAX ) + { + char str[128]; + snprintf( str, sizeof(str), + "Invalid offset for entity %d", i); + + psSHP->sHooks.Error( str ); + SHPClose(psSHP); + free( pabyBuf ); + return NULL; + } + if( nLength > (unsigned int)(INT_MAX / 2 - 4) ) + { + char str[128]; + snprintf( str, sizeof(str), + "Invalid length for entity %d", i); + + psSHP->sHooks.Error( str ); + SHPClose(psSHP); + free( pabyBuf ); + return NULL; + } + psSHP->panRecOffset[i] = nOffset*2; + psSHP->panRecSize[i] = nLength*2; + } + free( pabyBuf ); + + return( psSHP ); +} + +/************************************************************************/ +/* SHPOpenLLEx() */ +/* */ +/* Open the .shp and .shx files based on the basename of the */ +/* files or either file name. It generally invokes SHPRestoreSHX() */ +/* in case when bRestoreSHX equals true. */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPOpenLLEx( const char * pszLayer, const char * pszAccess, SAHooks *psHooks, + int bRestoreSHX ) + +{ + if ( !bRestoreSHX ) return SHPOpenLL ( pszLayer, pszAccess, psHooks ); + else + { + if ( SHPRestoreSHX ( pszLayer, pszAccess, psHooks ) ) + { + return SHPOpenLL ( pszLayer, pszAccess, psHooks ); + } + } + + return( NULL ); +} + +/************************************************************************/ +/* SHPRestoreSHX() */ +/* */ +/* Restore .SHX file using associated .SHP file. */ +/* */ +/************************************************************************/ + +int SHPAPI_CALL +SHPRestoreSHX ( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) + +{ + char *pszFullname, *pszBasename; + SAFile fpSHP, fpSHX; + + + uchar *pabyBuf; + int i; + size_t nFullnameLen; + unsigned int nSHPFilesize; + + size_t nMessageLen; + char *pszMessage; + + unsigned int nCurrentRecordOffset = 0; + unsigned int nCurrentSHPOffset = 100; + size_t nRealSHXContentSize = 100; + + const char pszSHXAccess[] = "w+b"; + char *pabySHXHeader; + char abyReadedRecord[8]; + unsigned int niRecord = 0; + unsigned int nRecordLength = 0; + unsigned int nRecordOffset = 50; + +/* -------------------------------------------------------------------- */ +/* Ensure the access string is one of the legal ones. We */ +/* ensure the result string indicates binary to avoid common */ +/* problems on Windows. */ +/* -------------------------------------------------------------------- */ + if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0 + || strcmp(pszAccess,"r+") == 0 ) + pszAccess = "r+b"; + else + { + pszAccess = "rb"; + } + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this machine. */ +/* -------------------------------------------------------------------- */ +#if !defined(bBigEndian) + i = 1; + if( *((uchar *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; +#endif + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszLayer)+5); + strcpy( pszBasename, pszLayer ); + for( i = (int)strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + +/* -------------------------------------------------------------------- */ +/* Open the .shp file. Note that files pulled from */ +/* a PC to Unix with upper case filenames won't work! */ +/* -------------------------------------------------------------------- */ + nFullnameLen = strlen(pszBasename) + 5; + pszFullname = (char *) malloc(nFullnameLen); + snprintf( pszFullname, nFullnameLen, "%s.shp", pszBasename ) ; + fpSHP = psHooks->FOpen(pszFullname, pszAccess ); + if( fpSHP == NULL ) + { + snprintf( pszFullname, nFullnameLen, "%s.SHP", pszBasename ); + fpSHP = psHooks->FOpen(pszFullname, pszAccess ); + } + + if( fpSHP == NULL ) + { + nMessageLen = strlen(pszBasename)*2+256; + pszMessage = (char *) malloc(nMessageLen); + snprintf( pszMessage, nMessageLen, "Unable to open %s.shp or %s.SHP.", + pszBasename, pszBasename ); + psHooks->Error( pszMessage ); + free( pszMessage ); + + free( pszBasename ); + free( pszFullname ); + + return( 0 ); + } + +/* -------------------------------------------------------------------- */ +/* Read the file size from the SHP file. */ +/* -------------------------------------------------------------------- */ + pabyBuf = (uchar *) malloc(100); + psHooks->FRead( pabyBuf, 100, 1, fpSHP ); + + nSHPFilesize = ((unsigned int)pabyBuf[24]<<24)|(pabyBuf[25]<<16)| + (pabyBuf[26]<<8)|pabyBuf[27]; + if( nSHPFilesize < 0xFFFFFFFFU / 2 ) + nSHPFilesize *= 2; + else + nSHPFilesize = 0xFFFFFFFEU; + + snprintf( pszFullname, nFullnameLen, "%s.shx", pszBasename ); + fpSHX = psHooks->FOpen( pszFullname, pszSHXAccess ); + + if( fpSHX == NULL ) + { + nMessageLen = strlen( pszBasename ) * 2 + 256; + pszMessage = (char *) malloc( nMessageLen ); + snprintf( pszMessage, nMessageLen, "Error opening file %s.shx for writing", + pszBasename ); + psHooks->Error( pszMessage ); + free( pszMessage ); + + psHooks->FClose( fpSHX ); + + free( pabyBuf ); + free( pszBasename ); + free( pszFullname ); + + return( 0 ); + } + +/* -------------------------------------------------------------------- */ +/* Open SHX and create it using SHP file content. */ +/* -------------------------------------------------------------------- */ + psHooks->FSeek( fpSHP, 100, 0 ); + pabySHXHeader = (char *) malloc ( 100 ); + memcpy( pabySHXHeader, pabyBuf, 100 ); + psHooks->FWrite( pabySHXHeader, 100, 1, fpSHX ); + + while( nCurrentSHPOffset < nSHPFilesize ) + { + if( psHooks->FRead( &niRecord, 4, 1, fpSHP ) == 1 && + psHooks->FRead( &nRecordLength, 4, 1, fpSHP ) == 1) + { + if( !bBigEndian ) SwapWord( 4, &nRecordOffset ); + memcpy( abyReadedRecord, &nRecordOffset, 4 ); + memcpy( abyReadedRecord + 4, &nRecordLength, 4 ); + + psHooks->FWrite( abyReadedRecord, 8, 1, fpSHX ); + + if ( !bBigEndian ) SwapWord( 4, &nRecordOffset ); + if ( !bBigEndian ) SwapWord( 4, &nRecordLength ); + nRecordOffset += nRecordLength + 4; + nCurrentRecordOffset += 8; + nCurrentSHPOffset += 8 + nRecordLength * 2; + + psHooks->FSeek( fpSHP, nCurrentSHPOffset, 0 ); + nRealSHXContentSize += 8; + } + else + { + nMessageLen = strlen( pszBasename ) * 2 + 256; + pszMessage = (char *) malloc( nMessageLen ); + snprintf( pszMessage, nMessageLen, "Error parsing .shp to restore .shx" ); + psHooks->Error( pszMessage ); + free( pszMessage ); + + psHooks->FClose( fpSHX ); + psHooks->FClose( fpSHP ); + + free( pabySHXHeader ); + free( pszBasename ); + free( pszFullname ); + + return( 0 ); + } + } + + nRealSHXContentSize /= 2; // Bytes counted -> WORDs + if( !bBigEndian ) SwapWord( 4, &nRealSHXContentSize ); + psHooks->FSeek( fpSHX, 24, 0 ); + psHooks->FWrite( &nRealSHXContentSize, 4, 1, fpSHX ); + + psHooks->FClose( fpSHP ); + psHooks->FClose( fpSHX ); + + free ( pabyBuf ); + free ( pszFullname ); + free ( pszBasename ); + free ( pabySHXHeader ); + + return( 1 ); +} + +/************************************************************************/ +/* SHPClose() */ +/* */ +/* Close the .shp and .shx files. */ +/************************************************************************/ + +void SHPAPI_CALL +SHPClose(SHPHandle psSHP ) + +{ + if( psSHP == NULL ) + return; + +/* -------------------------------------------------------------------- */ +/* Update the header if we have modified anything. */ +/* -------------------------------------------------------------------- */ + if( psSHP->bUpdated ) + SHPWriteHeader( psSHP ); + +/* -------------------------------------------------------------------- */ +/* Free all resources, and close files. */ +/* -------------------------------------------------------------------- */ + free( psSHP->panRecOffset ); + free( psSHP->panRecSize ); + + if ( psSHP->fpSHX != NULL) + psSHP->sHooks.FClose( psSHP->fpSHX ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + + if( psSHP->pabyRec != NULL ) + { + free( psSHP->pabyRec ); + } + + if( psSHP->pabyObjectBuf != NULL ) + { + free( psSHP->pabyObjectBuf ); + } + if( psSHP->psCachedObject != NULL ) + { + free( psSHP->psCachedObject ); + } + + free( psSHP ); +} + +/************************************************************************/ +/* SHPSetFastModeReadObject() */ +/************************************************************************/ + +/* If setting bFastMode = TRUE, the content of SHPReadObject() is owned by the SHPHandle. */ +/* So you cannot have 2 valid instances of SHPReadObject() simultaneously. */ +/* The SHPObject padfZ and padfM members may be NULL depending on the geometry */ +/* type. It is illegal to free at hand any of the pointer members of the SHPObject structure */ +void SHPAPI_CALL SHPSetFastModeReadObject( SHPHandle hSHP, int bFastMode ) +{ + if( bFastMode ) + { + if( hSHP->psCachedObject == NULL ) + { + hSHP->psCachedObject = (SHPObject*) calloc(1, sizeof(SHPObject)); + assert( hSHP->psCachedObject != NULL ); + } + } + + hSHP->bFastModeReadObject = bFastMode; +} + +/************************************************************************/ +/* SHPGetInfo() */ +/* */ +/* Fetch general information about the shape file. */ +/************************************************************************/ + +void SHPAPI_CALL +SHPGetInfo(SHPHandle psSHP, int * pnEntities, int * pnShapeType, + double * padfMinBound, double * padfMaxBound ) + +{ + int i; + + if( psSHP == NULL ) + return; + + if( pnEntities != NULL ) + *pnEntities = psSHP->nRecords; + + if( pnShapeType != NULL ) + *pnShapeType = psSHP->nShapeType; + + for( i = 0; i < 4; i++ ) + { + if( padfMinBound != NULL ) + padfMinBound[i] = psSHP->adBoundsMin[i]; + if( padfMaxBound != NULL ) + padfMaxBound[i] = psSHP->adBoundsMax[i]; + } +} + +/************************************************************************/ +/* SHPCreate() */ +/* */ +/* Create a new shape file and return a handle to the open */ +/* shape file with read/write access. */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPCreate( const char * pszLayer, int nShapeType ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return SHPCreateLL( pszLayer, nShapeType, &sHooks ); +} + +/************************************************************************/ +/* SHPCreate() */ +/* */ +/* Create a new shape file and return a handle to the open */ +/* shape file with read/write access. */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPCreateLL( const char * pszLayer, int nShapeType, SAHooks *psHooks ) + +{ + char *pszBasename = NULL, *pszFullname = NULL; + int i; + SAFile fpSHP = NULL, fpSHX = NULL; + uchar abyHeader[100]; + int32 i32; + double dValue; + size_t nFullnameLen; + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this system. */ +/* -------------------------------------------------------------------- */ +#if !defined(bBigEndian) + i = 1; + if( *((uchar *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; +#endif + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszLayer)+5); + strcpy( pszBasename, pszLayer ); + for( i = (int)strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + +/* -------------------------------------------------------------------- */ +/* Open the two files so we can write their headers. */ +/* -------------------------------------------------------------------- */ + nFullnameLen = strlen(pszBasename) + 5; + pszFullname = (char *) malloc(nFullnameLen); + snprintf( pszFullname, nFullnameLen, "%s.shp", pszBasename ); + fpSHP = psHooks->FOpen(pszFullname, "wb" ); + if( fpSHP == NULL ) + { + char szError[200]; + snprintf( szError, sizeof(szError), + "Failed to create file %s: %s", + pszFullname, strerror(errno) ); + psHooks->Error( szError ); + + goto error; + } + + snprintf( pszFullname, nFullnameLen, "%s.shx", pszBasename ); + fpSHX = psHooks->FOpen(pszFullname, "wb" ); + if( fpSHX == NULL ) + { + char szError[200]; + snprintf( szError, sizeof(szError), + "Failed to create file %s: %s", + pszFullname, strerror(errno) ); + psHooks->Error( szError ); + goto error; + } + + free( pszFullname ); pszFullname = NULL; + free( pszBasename ); pszBasename = NULL; + +/* -------------------------------------------------------------------- */ +/* Prepare header block for .shp file. */ +/* -------------------------------------------------------------------- */ + memset( abyHeader, 0, sizeof(abyHeader) ); + + abyHeader[2] = 0x27; /* magic cookie */ + abyHeader[3] = 0x0a; + + i32 = 50; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + i32 = 1000; /* version */ + ByteCopy( &i32, abyHeader+28, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+28 ); + + i32 = nShapeType; /* shape type */ + ByteCopy( &i32, abyHeader+32, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+32 ); + + dValue = 0.0; /* set bounds */ + ByteCopy( &dValue, abyHeader+36, 8 ); + ByteCopy( &dValue, abyHeader+44, 8 ); + ByteCopy( &dValue, abyHeader+52, 8 ); + ByteCopy( &dValue, abyHeader+60, 8 ); + +/* -------------------------------------------------------------------- */ +/* Write .shp file header. */ +/* -------------------------------------------------------------------- */ + if( psHooks->FWrite( abyHeader, 100, 1, fpSHP ) != 1 ) + { + char szError[200]; + + snprintf( szError, sizeof(szError), + "Failed to write .shp header: %s", strerror(errno) ); + psHooks->Error( szError ); + + goto error; + } + +/* -------------------------------------------------------------------- */ +/* Prepare, and write .shx file header. */ +/* -------------------------------------------------------------------- */ + i32 = 50; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + if( psHooks->FWrite( abyHeader, 100, 1, fpSHX ) != 1 ) + { + char szError[200]; + + snprintf( szError, sizeof(szError), + "Failure writing .shx header: %s", strerror(errno) ); + psHooks->Error( szError ); + + goto error; + } + +/* -------------------------------------------------------------------- */ +/* Close the files, and then open them as regular existing files. */ +/* -------------------------------------------------------------------- */ + psHooks->FClose( fpSHP ); + psHooks->FClose( fpSHX ); + + return( SHPOpenLL( pszLayer, "r+b", psHooks ) ); + +error: + if (pszFullname) free(pszFullname); + if (pszBasename) free(pszBasename); + if (fpSHP) psHooks->FClose( fpSHP ); + if (fpSHX) psHooks->FClose( fpSHX ); + return NULL; +} + +/************************************************************************/ +/* _SHPSetBounds() */ +/* */ +/* Compute a bounds rectangle for a shape, and set it into the */ +/* indicated location in the record. */ +/************************************************************************/ + +static void _SHPSetBounds( uchar * pabyRec, SHPObject * psShape ) + +{ + ByteCopy( &(psShape->dfXMin), pabyRec + 0, 8 ); + ByteCopy( &(psShape->dfYMin), pabyRec + 8, 8 ); + ByteCopy( &(psShape->dfXMax), pabyRec + 16, 8 ); + ByteCopy( &(psShape->dfYMax), pabyRec + 24, 8 ); + + if( bBigEndian ) + { + SwapWord( 8, pabyRec + 0 ); + SwapWord( 8, pabyRec + 8 ); + SwapWord( 8, pabyRec + 16 ); + SwapWord( 8, pabyRec + 24 ); + } +} + +/************************************************************************/ +/* SHPComputeExtents() */ +/* */ +/* Recompute the extents of a shape. Automatically done by */ +/* SHPCreateObject(). */ +/************************************************************************/ + +void SHPAPI_CALL +SHPComputeExtents( SHPObject * psObject ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* Build extents for this object. */ +/* -------------------------------------------------------------------- */ + if( psObject->nVertices > 0 ) + { + psObject->dfXMin = psObject->dfXMax = psObject->padfX[0]; + psObject->dfYMin = psObject->dfYMax = psObject->padfY[0]; + psObject->dfZMin = psObject->dfZMax = psObject->padfZ[0]; + psObject->dfMMin = psObject->dfMMax = psObject->padfM[0]; + } + + for( i = 0; i < psObject->nVertices; i++ ) + { + psObject->dfXMin = MIN(psObject->dfXMin, psObject->padfX[i]); + psObject->dfYMin = MIN(psObject->dfYMin, psObject->padfY[i]); + psObject->dfZMin = MIN(psObject->dfZMin, psObject->padfZ[i]); + psObject->dfMMin = MIN(psObject->dfMMin, psObject->padfM[i]); + + psObject->dfXMax = MAX(psObject->dfXMax, psObject->padfX[i]); + psObject->dfYMax = MAX(psObject->dfYMax, psObject->padfY[i]); + psObject->dfZMax = MAX(psObject->dfZMax, psObject->padfZ[i]); + psObject->dfMMax = MAX(psObject->dfMMax, psObject->padfM[i]); + } +} + +/************************************************************************/ +/* SHPCreateObject() */ +/* */ +/* Create a shape object. It should be freed with */ +/* SHPDestroyObject(). */ +/************************************************************************/ + +SHPObject SHPAPI_CALL1(*) +SHPCreateObject( int nSHPType, int nShapeId, int nParts, + const int * panPartStart, const int * panPartType, + int nVertices, const double *padfX, const double *padfY, + const double * padfZ, const double * padfM ) + +{ + SHPObject *psObject; + int i, bHasM, bHasZ; + + psObject = (SHPObject *) calloc(1,sizeof(SHPObject)); + psObject->nSHPType = nSHPType; + psObject->nShapeId = nShapeId; + psObject->bMeasureIsUsed = FALSE; + +/* -------------------------------------------------------------------- */ +/* Establish whether this shape type has M, and Z values. */ +/* -------------------------------------------------------------------- */ + if( nSHPType == SHPT_ARCM + || nSHPType == SHPT_POINTM + || nSHPType == SHPT_POLYGONM + || nSHPType == SHPT_MULTIPOINTM ) + { + bHasM = TRUE; + bHasZ = FALSE; + } + else if( nSHPType == SHPT_ARCZ + || nSHPType == SHPT_POINTZ + || nSHPType == SHPT_POLYGONZ + || nSHPType == SHPT_MULTIPOINTZ + || nSHPType == SHPT_MULTIPATCH ) + { + bHasM = TRUE; + bHasZ = TRUE; + } + else + { + bHasM = FALSE; + bHasZ = FALSE; + } + +/* -------------------------------------------------------------------- */ +/* Capture parts. Note that part type is optional, and */ +/* defaults to ring. */ +/* -------------------------------------------------------------------- */ + if( nSHPType == SHPT_ARC || nSHPType == SHPT_POLYGON + || nSHPType == SHPT_ARCM || nSHPType == SHPT_POLYGONM + || nSHPType == SHPT_ARCZ || nSHPType == SHPT_POLYGONZ + || nSHPType == SHPT_MULTIPATCH ) + { + psObject->nParts = MAX(1,nParts); + + psObject->panPartStart = (int *) + calloc(sizeof(int), psObject->nParts); + psObject->panPartType = (int *) + malloc(sizeof(int) * psObject->nParts); + + psObject->panPartStart[0] = 0; + psObject->panPartType[0] = SHPP_RING; + + for( i = 0; i < nParts; i++ ) + { + if( panPartStart != NULL ) + psObject->panPartStart[i] = panPartStart[i]; + + if( panPartType != NULL ) + psObject->panPartType[i] = panPartType[i]; + else + psObject->panPartType[i] = SHPP_RING; + } + + if( psObject->panPartStart[0] != 0 ) + psObject->panPartStart[0] = 0; + } + +/* -------------------------------------------------------------------- */ +/* Capture vertices. Note that X, Y, Z and M are optional. */ +/* -------------------------------------------------------------------- */ + if( nVertices > 0 ) + { + size_t nSize = sizeof(double) * nVertices; + psObject->padfX = (double *) padfX ? malloc(nSize) : + calloc(sizeof(double),nVertices); + psObject->padfY = (double *) padfY ? malloc(nSize) : + calloc(sizeof(double),nVertices); + psObject->padfZ = (double *) padfZ && bHasZ ? malloc(nSize) : + calloc(sizeof(double),nVertices); + psObject->padfM = (double *) padfM && bHasM ? malloc(nSize) : + calloc(sizeof(double),nVertices); + if( padfX != NULL ) + memcpy(psObject->padfX, padfX, nSize); + if( padfY != NULL ) + memcpy(psObject->padfY, padfY, nSize); + if( padfZ != NULL && bHasZ ) + memcpy(psObject->padfZ, padfZ, nSize); + if( padfM != NULL && bHasM ) + { + memcpy(psObject->padfM, padfM, nSize); + psObject->bMeasureIsUsed = TRUE; + } + } + +/* -------------------------------------------------------------------- */ +/* Compute the extents. */ +/* -------------------------------------------------------------------- */ + psObject->nVertices = nVertices; + SHPComputeExtents( psObject ); + + return( psObject ); +} + +/************************************************************************/ +/* SHPCreateSimpleObject() */ +/* */ +/* Create a simple (common) shape object. Destroy with */ +/* SHPDestroyObject(). */ +/************************************************************************/ + +SHPObject SHPAPI_CALL1(*) +SHPCreateSimpleObject( int nSHPType, int nVertices, + const double * padfX, const double * padfY, + const double * padfZ ) + +{ + return( SHPCreateObject( nSHPType, -1, 0, NULL, NULL, + nVertices, padfX, padfY, padfZ, NULL ) ); +} + +/************************************************************************/ +/* SHPWriteObject() */ +/* */ +/* Write out the vertices of a new structure. Note that it is */ +/* only possible to write vertices at the end of the file. */ +/************************************************************************/ + +int SHPAPI_CALL +SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) + +{ + unsigned int nRecordOffset, nRecordSize=0; + int i; + uchar *pabyRec; + int32 i32; + int bAppendToLastRecord = FALSE; + int bAppendToFile = FALSE; + + psSHP->bUpdated = TRUE; + +/* -------------------------------------------------------------------- */ +/* Ensure that shape object matches the type of the file it is */ +/* being written to. */ +/* -------------------------------------------------------------------- */ + assert( psObject->nSHPType == psSHP->nShapeType + || psObject->nSHPType == SHPT_NULL ); + +/* -------------------------------------------------------------------- */ +/* Ensure that -1 is used for appends. Either blow an */ +/* assertion, or if they are disabled, set the shapeid to -1 */ +/* for appends. */ +/* -------------------------------------------------------------------- */ + assert( nShapeId == -1 + || (nShapeId >= 0 && nShapeId < psSHP->nRecords) ); + + if( nShapeId != -1 && nShapeId >= psSHP->nRecords ) + nShapeId = -1; + +/* -------------------------------------------------------------------- */ +/* Add the new entity to the in memory index. */ +/* -------------------------------------------------------------------- */ + if( nShapeId == -1 && psSHP->nRecords+1 > psSHP->nMaxRecords ) + { + int nNewMaxRecords = psSHP->nMaxRecords + psSHP->nMaxRecords / 3 + 100; + unsigned int* panRecOffsetNew; + unsigned int* panRecSizeNew; + + panRecOffsetNew = (unsigned int *) + SfRealloc(psSHP->panRecOffset,sizeof(unsigned int) * nNewMaxRecords ); + if( panRecOffsetNew == NULL ) + return -1; + psSHP->panRecOffset = panRecOffsetNew; + + panRecSizeNew = (unsigned int *) + SfRealloc(psSHP->panRecSize,sizeof(unsigned int) * nNewMaxRecords ); + if( panRecSizeNew == NULL ) + return -1; + psSHP->panRecSize = panRecSizeNew; + + psSHP->nMaxRecords = nNewMaxRecords; + } + +/* -------------------------------------------------------------------- */ +/* Initialize record. */ +/* -------------------------------------------------------------------- */ + pabyRec = (uchar *) malloc(psObject->nVertices * 4 * sizeof(double) + + psObject->nParts * 8 + 128); + if( pabyRec == NULL ) + return -1; + +/* -------------------------------------------------------------------- */ +/* Extract vertices for a Polygon or Arc. */ +/* -------------------------------------------------------------------- */ + if( psObject->nSHPType == SHPT_POLYGON + || psObject->nSHPType == SHPT_POLYGONZ + || psObject->nSHPType == SHPT_POLYGONM + || psObject->nSHPType == SHPT_ARC + || psObject->nSHPType == SHPT_ARCZ + || psObject->nSHPType == SHPT_ARCM + || psObject->nSHPType == SHPT_MULTIPATCH ) + { + int32 nPoints, nParts; + + nPoints = psObject->nVertices; + nParts = psObject->nParts; + + _SHPSetBounds( pabyRec + 12, psObject ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + if( bBigEndian ) SwapWord( 4, &nParts ); + + ByteCopy( &nPoints, pabyRec + 40 + 8, 4 ); + ByteCopy( &nParts, pabyRec + 36 + 8, 4 ); + + nRecordSize = 52; + + /* + * Write part start positions. + */ + ByteCopy( psObject->panPartStart, pabyRec + 44 + 8, + 4 * psObject->nParts ); + for( i = 0; i < psObject->nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, pabyRec + 44 + 8 + 4*i ); + nRecordSize += 4; + } + + /* + * Write multipatch part types if needed. + */ + if( psObject->nSHPType == SHPT_MULTIPATCH ) + { + memcpy( pabyRec + nRecordSize, psObject->panPartType, + 4*psObject->nParts ); + for( i = 0; i < psObject->nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, pabyRec + nRecordSize ); + nRecordSize += 4; + } + } + + /* + * Write the (x,y) vertex values. + */ + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfX + i, pabyRec + nRecordSize, 8 ); + ByteCopy( psObject->padfY + i, pabyRec + nRecordSize + 8, 8 ); + + if( bBigEndian ) + SwapWord( 8, pabyRec + nRecordSize ); + + if( bBigEndian ) + SwapWord( 8, pabyRec + nRecordSize + 8 ); + + nRecordSize += 2 * 8; + } + + /* + * Write the Z coordinates (if any). + */ + if( psObject->nSHPType == SHPT_POLYGONZ + || psObject->nSHPType == SHPT_ARCZ + || psObject->nSHPType == SHPT_MULTIPATCH ) + { + ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + + /* + * Write the M values, if any. + */ + if( psObject->bMeasureIsUsed + && (psObject->nSHPType == SHPT_POLYGONM + || psObject->nSHPType == SHPT_ARCM +#ifndef DISABLE_MULTIPATCH_MEASURE + || psObject->nSHPType == SHPT_MULTIPATCH +#endif + || psObject->nSHPType == SHPT_POLYGONZ + || psObject->nSHPType == SHPT_ARCZ) ) + { + ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + } + +/* -------------------------------------------------------------------- */ +/* Extract vertices for a MultiPoint. */ +/* -------------------------------------------------------------------- */ + else if( psObject->nSHPType == SHPT_MULTIPOINT + || psObject->nSHPType == SHPT_MULTIPOINTZ + || psObject->nSHPType == SHPT_MULTIPOINTM ) + { + int32 nPoints; + + nPoints = psObject->nVertices; + + _SHPSetBounds( pabyRec + 12, psObject ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + ByteCopy( &nPoints, pabyRec + 44, 4 ); + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfX + i, pabyRec + 48 + i*16, 8 ); + ByteCopy( psObject->padfY + i, pabyRec + 48 + i*16 + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 ); + if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 + 8 ); + } + + nRecordSize = 48 + 16 * psObject->nVertices; + + if( psObject->nSHPType == SHPT_MULTIPOINTZ ) + { + ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + + if( psObject->bMeasureIsUsed + && (psObject->nSHPType == SHPT_MULTIPOINTZ + || psObject->nSHPType == SHPT_MULTIPOINTM) ) + { + ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + } + +/* -------------------------------------------------------------------- */ +/* Write point. */ +/* -------------------------------------------------------------------- */ + else if( psObject->nSHPType == SHPT_POINT + || psObject->nSHPType == SHPT_POINTZ + || psObject->nSHPType == SHPT_POINTM ) + { + ByteCopy( psObject->padfX, pabyRec + 12, 8 ); + ByteCopy( psObject->padfY, pabyRec + 20, 8 ); + + if( bBigEndian ) SwapWord( 8, pabyRec + 12 ); + if( bBigEndian ) SwapWord( 8, pabyRec + 20 ); + + nRecordSize = 28; + + if( psObject->nSHPType == SHPT_POINTZ ) + { + ByteCopy( psObject->padfZ, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + + if( psObject->bMeasureIsUsed + && (psObject->nSHPType == SHPT_POINTZ + || psObject->nSHPType == SHPT_POINTM) ) + { + ByteCopy( psObject->padfM, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + +/* -------------------------------------------------------------------- */ +/* Not much to do for null geometries. */ +/* -------------------------------------------------------------------- */ + else if( psObject->nSHPType == SHPT_NULL ) + { + nRecordSize = 12; + } + + else + { + /* unknown type */ + assert( FALSE ); + } + +/* -------------------------------------------------------------------- */ +/* Establish where we are going to put this record. If we are */ +/* rewriting the last record of the file, then we can update it in */ +/* place. Otherwise if rewriting an existing record, and it will */ +/* fit, then put it back where the original came from. Otherwise */ +/* write at the end. */ +/* -------------------------------------------------------------------- */ + if( nShapeId != -1 && psSHP->panRecOffset[nShapeId] + + psSHP->panRecSize[nShapeId] + 8 == psSHP->nFileSize ) + { + nRecordOffset = psSHP->panRecOffset[nShapeId]; + bAppendToLastRecord = TRUE; + } + else if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 ) + { + unsigned int nExpectedSize = psSHP->nFileSize + nRecordSize; + if( nExpectedSize < psSHP->nFileSize ) // due to unsigned int overflow + { + char str[128]; + snprintf( str, sizeof(str), "Failed to write shape object. " + "File size cannot reach %u + %u.", + psSHP->nFileSize, nRecordSize ); + psSHP->sHooks.Error( str ); + free( pabyRec ); + return -1; + } + + bAppendToFile = TRUE; + nRecordOffset = psSHP->nFileSize; + } + else + { + nRecordOffset = psSHP->panRecOffset[nShapeId]; + } + +/* -------------------------------------------------------------------- */ +/* Set the shape type, record number, and record size. */ +/* -------------------------------------------------------------------- */ + i32 = (nShapeId < 0) ? psSHP->nRecords+1 : nShapeId+1; /* record # */ + if( !bBigEndian ) SwapWord( 4, &i32 ); + ByteCopy( &i32, pabyRec, 4 ); + + i32 = (nRecordSize-8)/2; /* record size */ + if( !bBigEndian ) SwapWord( 4, &i32 ); + ByteCopy( &i32, pabyRec + 4, 4 ); + + i32 = psObject->nSHPType; /* shape type */ + if( bBigEndian ) SwapWord( 4, &i32 ); + ByteCopy( &i32, pabyRec + 8, 4 ); + +/* -------------------------------------------------------------------- */ +/* Write out record. */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FSeek( psSHP->fpSHP, nRecordOffset, 0 ) != 0 ) + { + char szError[200]; + + snprintf( szError, sizeof(szError), + "Error in psSHP->sHooks.FSeek() while writing object to .shp file: %s", + strerror(errno) ); + psSHP->sHooks.Error( szError ); + + free( pabyRec ); + return -1; + } + if( psSHP->sHooks.FWrite( pabyRec, nRecordSize, 1, psSHP->fpSHP ) < 1 ) + { + char szError[200]; + + snprintf( szError, sizeof(szError), + "Error in psSHP->sHooks.FWrite() while writing object of %u bytes to .shp file: %s", + nRecordSize, strerror(errno) ); + psSHP->sHooks.Error( szError ); + + free( pabyRec ); + return -1; + } + + free( pabyRec ); + + if( bAppendToLastRecord ) + { + psSHP->nFileSize = psSHP->panRecOffset[nShapeId] + nRecordSize; + } + else if( bAppendToFile ) + { + if( nShapeId == -1 ) + nShapeId = psSHP->nRecords++; + + psSHP->panRecOffset[nShapeId] = psSHP->nFileSize; + psSHP->nFileSize += nRecordSize; + } + psSHP->panRecSize[nShapeId] = nRecordSize-8; + +/* -------------------------------------------------------------------- */ +/* Expand file wide bounds based on this shape. */ +/* -------------------------------------------------------------------- */ + if( psSHP->adBoundsMin[0] == 0.0 + && psSHP->adBoundsMax[0] == 0.0 + && psSHP->adBoundsMin[1] == 0.0 + && psSHP->adBoundsMax[1] == 0.0 ) + { + if( psObject->nSHPType == SHPT_NULL || psObject->nVertices == 0 ) + { + psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = 0.0; + psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = 0.0; + psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = 0.0; + psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = 0.0; + } + else + { + psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = psObject->padfX[0]; + psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = psObject->padfY[0]; + psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = psObject->padfZ ? psObject->padfZ[0] : 0.0; + psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = psObject->padfM ? psObject->padfM[0] : 0.0; + } + } + + for( i = 0; i < psObject->nVertices; i++ ) + { + psSHP->adBoundsMin[0] = MIN(psSHP->adBoundsMin[0],psObject->padfX[i]); + psSHP->adBoundsMin[1] = MIN(psSHP->adBoundsMin[1],psObject->padfY[i]); + psSHP->adBoundsMax[0] = MAX(psSHP->adBoundsMax[0],psObject->padfX[i]); + psSHP->adBoundsMax[1] = MAX(psSHP->adBoundsMax[1],psObject->padfY[i]); + if( psObject->padfZ ) + { + psSHP->adBoundsMin[2] = MIN(psSHP->adBoundsMin[2],psObject->padfZ[i]); + psSHP->adBoundsMax[2] = MAX(psSHP->adBoundsMax[2],psObject->padfZ[i]); + } + if( psObject->padfM ) + { + psSHP->adBoundsMin[3] = MIN(psSHP->adBoundsMin[3],psObject->padfM[i]); + psSHP->adBoundsMax[3] = MAX(psSHP->adBoundsMax[3],psObject->padfM[i]); + } + } + + return( nShapeId ); +} + +/************************************************************************/ +/* SHPAllocBuffer() */ +/************************************************************************/ + +static void* SHPAllocBuffer(unsigned char** pBuffer, int nSize) +{ + unsigned char* pRet; + + if( pBuffer == NULL ) + return calloc(1, nSize); + + pRet = *pBuffer; + if( pRet == NULL ) + return NULL; + + (*pBuffer) += nSize; + return pRet; +} + +/************************************************************************/ +/* SHPReallocObjectBufIfNecessary() */ +/************************************************************************/ + +static unsigned char* SHPReallocObjectBufIfNecessary ( SHPHandle psSHP, + int nObjectBufSize ) +{ + unsigned char* pBuffer; + if( nObjectBufSize == 0 ) + { + nObjectBufSize = 4 * sizeof(double); + } + if( nObjectBufSize > psSHP->nObjectBufSize ) + { + pBuffer = (unsigned char*) realloc( psSHP->pabyObjectBuf, nObjectBufSize ); + if( pBuffer != NULL ) + { + psSHP->pabyObjectBuf = pBuffer; + psSHP->nObjectBufSize = nObjectBufSize; + } + } + else + pBuffer = psSHP->pabyObjectBuf; + return pBuffer; +} + +/************************************************************************/ +/* SHPReadObject() */ +/* */ +/* Read the vertices, parts, and other non-attribute information */ +/* for one shape. */ +/************************************************************************/ + +SHPObject SHPAPI_CALL1(*) +SHPReadObject( SHPHandle psSHP, int hEntity ) + +{ + int nEntitySize, nRequiredSize; + SHPObject *psShape; + char szErrorMsg[128]; + int nSHPType; + int nBytesRead; + +/* -------------------------------------------------------------------- */ +/* Validate the record/entity number. */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity >= psSHP->nRecords ) + return( NULL ); + +/* -------------------------------------------------------------------- */ +/* Read offset/length from SHX loading if necessary. */ +/* -------------------------------------------------------------------- */ + if( psSHP->panRecOffset[hEntity] == 0 && psSHP->fpSHX != NULL ) + { + unsigned int nOffset, nLength; + + if( psSHP->sHooks.FSeek( psSHP->fpSHX, 100 + 8 * hEntity, 0 ) != 0 || + psSHP->sHooks.FRead( &nOffset, 1, 4, psSHP->fpSHX ) != 4 || + psSHP->sHooks.FRead( &nLength, 1, 4, psSHP->fpSHX ) != 4 ) + { + char str[128]; + snprintf( str, sizeof(str), + "Error in fseek()/fread() reading object from .shx file at offset %d", + 100 + 8 * hEntity); + + psSHP->sHooks.Error( str ); + return NULL; + } + if( !bBigEndian ) SwapWord( 4, &nOffset ); + if( !bBigEndian ) SwapWord( 4, &nLength ); + + if( nOffset > (unsigned int)INT_MAX ) + { + char str[128]; + snprintf( str, sizeof(str), + "Invalid offset for entity %d", hEntity); + + psSHP->sHooks.Error( str ); + return NULL; + } + if( nLength > (unsigned int)(INT_MAX / 2 - 4) ) + { + char str[128]; + snprintf( str, sizeof(str), + "Invalid length for entity %d", hEntity); + + psSHP->sHooks.Error( str ); + return NULL; + } + + psSHP->panRecOffset[hEntity] = nOffset*2; + psSHP->panRecSize[hEntity] = nLength*2; + } + +/* -------------------------------------------------------------------- */ +/* Ensure our record buffer is large enough. */ +/* -------------------------------------------------------------------- */ + nEntitySize = psSHP->panRecSize[hEntity]+8; + if( nEntitySize > psSHP->nBufSize ) + { + uchar* pabyRecNew; + int nNewBufSize = nEntitySize; + if( nNewBufSize < INT_MAX - nNewBufSize / 3 ) + nNewBufSize += nNewBufSize / 3; + else + nNewBufSize = INT_MAX; + + /* Before allocating too much memory, check that the file is big enough */ + if( nEntitySize >= 10 * 1024 * 1024 && + (psSHP->panRecOffset[hEntity] >= psSHP->nFileSize || + (unsigned int)nEntitySize > psSHP->nFileSize - psSHP->panRecOffset[hEntity]) ) + { + /* We do as is we didn't trust the file size in the header */ + SAOffset nFileSize; + psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 2 ); + nFileSize = psSHP->sHooks.FTell(psSHP->fpSHP); + if( nFileSize >= 0xFFFFFFFFU ) + psSHP->nFileSize = 0xFFFFFFFFU; + else + psSHP->nFileSize = (unsigned int)nFileSize; + + if( psSHP->panRecOffset[hEntity] >= psSHP->nFileSize || + (unsigned int)nEntitySize > psSHP->nFileSize - psSHP->panRecOffset[hEntity] ) + { + char str[128]; + snprintf( str, sizeof(str), + "Error in fread() reading object of size %d at offset %u from .shp file", + nEntitySize, psSHP->panRecOffset[hEntity] ); + + psSHP->sHooks.Error( str ); + return NULL; + } + } + + pabyRecNew = (uchar *) SfRealloc(psSHP->pabyRec,nNewBufSize); + if (pabyRecNew == NULL) + { + char szError[200]; + + snprintf( szError, sizeof(szError), + "Not enough memory to allocate requested memory (nNewBufSize=%d). " + "Probably broken SHP file", nNewBufSize); + psSHP->sHooks.Error( szError ); + return NULL; + } + + /* Only set new buffer size after successful alloc */ + psSHP->pabyRec = pabyRecNew; + psSHP->nBufSize = nNewBufSize; + } + + /* In case we were not able to reallocate the buffer on a previous step */ + if (psSHP->pabyRec == NULL) + { + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Read the record. */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FSeek( psSHP->fpSHP, psSHP->panRecOffset[hEntity], 0 ) != 0 ) + { + /* + * TODO - mloskot: Consider detailed diagnostics of shape file, + * for example to detect if file is truncated. + */ + char str[128]; + snprintf( str, sizeof(str), + "Error in fseek() reading object from .shp file at offset %u", + psSHP->panRecOffset[hEntity]); + + psSHP->sHooks.Error( str ); + return NULL; + } + + nBytesRead = (int)psSHP->sHooks.FRead( psSHP->pabyRec, 1, nEntitySize, psSHP->fpSHP ); + + /* Special case for a shapefile whose .shx content length field is not equal */ + /* to the content length field of the .shp, which is a violation of "The */ + /* content length stored in the index record is the same as the value stored in the main */ + /* file record header." (http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf, page 24) */ + /* Actually in that case the .shx content length is equal to the .shp content length + */ + /* 4 (16 bit words), representing the 8 bytes of the record header... */ + if( nBytesRead >= 8 && nBytesRead == nEntitySize - 8 ) + { + /* Do a sanity check */ + int nSHPContentLength; + memcpy( &nSHPContentLength, psSHP->pabyRec + 4, 4 ); + if( !bBigEndian ) SwapWord( 4, &(nSHPContentLength) ); + if( nSHPContentLength < 0 || + nSHPContentLength > INT_MAX / 2 - 4 || + 2 * nSHPContentLength + 8 != nBytesRead ) + { + char str[128]; + snprintf( str, sizeof(str), + "Sanity check failed when trying to recover from inconsistent .shx/.shp with shape %d", + hEntity ); + + psSHP->sHooks.Error( str ); + return NULL; + } + } + else if( nBytesRead != nEntitySize ) + { + /* + * TODO - mloskot: Consider detailed diagnostics of shape file, + * for example to detect if file is truncated. + */ + char str[128]; + snprintf( str, sizeof(str), + "Error in fread() reading object of size %d at offset %u from .shp file", + nEntitySize, psSHP->panRecOffset[hEntity] ); + + psSHP->sHooks.Error( str ); + return NULL; + } + + if ( 8 + 4 > nEntitySize ) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + psSHP->sHooks.Error( szErrorMsg ); + return NULL; + } + memcpy( &nSHPType, psSHP->pabyRec + 8, 4 ); + + if( bBigEndian ) SwapWord( 4, &(nSHPType) ); + +/* -------------------------------------------------------------------- */ +/* Allocate and minimally initialize the object. */ +/* -------------------------------------------------------------------- */ + if( psSHP->bFastModeReadObject ) + { + if( psSHP->psCachedObject->bFastModeReadObject ) + { + psSHP->sHooks.Error( "Invalid read pattern in fast read mode. " + "SHPDestroyObject() should be called." ); + return NULL; + } + + psShape = psSHP->psCachedObject; + memset(psShape, 0, sizeof(SHPObject)); + } + else + psShape = (SHPObject *) calloc(1,sizeof(SHPObject)); + psShape->nShapeId = hEntity; + psShape->nSHPType = nSHPType; + psShape->bMeasureIsUsed = FALSE; + psShape->bFastModeReadObject = psSHP->bFastModeReadObject; + +/* ==================================================================== */ +/* Extract vertices for a Polygon or Arc. */ +/* ==================================================================== */ + if( psShape->nSHPType == SHPT_POLYGON || psShape->nSHPType == SHPT_ARC + || psShape->nSHPType == SHPT_POLYGONZ + || psShape->nSHPType == SHPT_POLYGONM + || psShape->nSHPType == SHPT_ARCZ + || psShape->nSHPType == SHPT_ARCM + || psShape->nSHPType == SHPT_MULTIPATCH ) + { + int32 nPoints, nParts; + int i, nOffset; + unsigned char* pBuffer = NULL; + unsigned char** ppBuffer = NULL; + + if ( 40 + 8 + 4 > nEntitySize ) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } +/* -------------------------------------------------------------------- */ +/* Get the X/Y bounds. */ +/* -------------------------------------------------------------------- */ + memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); + memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); + memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); + memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); + +/* -------------------------------------------------------------------- */ +/* Extract part/point count, and build vertex and part arrays */ +/* to proper size. */ +/* -------------------------------------------------------------------- */ + memcpy( &nPoints, psSHP->pabyRec + 40 + 8, 4 ); + memcpy( &nParts, psSHP->pabyRec + 36 + 8, 4 ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + if( bBigEndian ) SwapWord( 4, &nParts ); + + /* nPoints and nParts are unsigned */ + if (/* nPoints < 0 || nParts < 0 || */ + nPoints > 50 * 1000 * 1000 || nParts > 10 * 1000 * 1000) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d, nPoints=%u, nParts=%u.", + hEntity, nPoints, nParts); + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + /* With the previous checks on nPoints and nParts, */ + /* we should not overflow here and after */ + /* since 50 M * (16 + 8 + 8) = 1 600 MB */ + nRequiredSize = 44 + 8 + 4 * nParts + 16 * nPoints; + if ( psShape->nSHPType == SHPT_POLYGONZ + || psShape->nSHPType == SHPT_ARCZ + || psShape->nSHPType == SHPT_MULTIPATCH ) + { + nRequiredSize += 16 + 8 * nPoints; + } + if( psShape->nSHPType == SHPT_MULTIPATCH ) + { + nRequiredSize += 4 * nParts; + } + if (nRequiredSize > nEntitySize) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d, nPoints=%u, nParts=%u, nEntitySize=%d.", + hEntity, nPoints, nParts, nEntitySize); + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + if( psShape->bFastModeReadObject ) + { + int nObjectBufSize = 4 * sizeof(double) * nPoints + 2 * sizeof(int) * nParts; + pBuffer = SHPReallocObjectBufIfNecessary(psSHP, nObjectBufSize); + ppBuffer = &pBuffer; + } + + psShape->nVertices = nPoints; + psShape->padfX = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfY = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfZ = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfM = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + + psShape->nParts = nParts; + psShape->panPartStart = (int *) SHPAllocBuffer(ppBuffer, nParts * sizeof(int)); + psShape->panPartType = (int *) SHPAllocBuffer(ppBuffer, nParts * sizeof(int)); + + if (psShape->padfX == NULL || + psShape->padfY == NULL || + psShape->padfZ == NULL || + psShape->padfM == NULL || + psShape->panPartStart == NULL || + psShape->panPartType == NULL) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Not enough memory to allocate requested memory (nPoints=%u, nParts=%u) for shape %d. " + "Probably broken SHP file", nPoints, nParts, hEntity ); + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + for( i = 0; (int32)i < nParts; i++ ) + psShape->panPartType[i] = SHPP_RING; + +/* -------------------------------------------------------------------- */ +/* Copy out the part array from the record. */ +/* -------------------------------------------------------------------- */ + memcpy( psShape->panPartStart, psSHP->pabyRec + 44 + 8, 4 * nParts ); + for( i = 0; (int32)i < nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, psShape->panPartStart+i ); + + /* We check that the offset is inside the vertex array */ + if (psShape->panPartStart[i] < 0 + || (psShape->panPartStart[i] >= psShape->nVertices + && psShape->nVertices > 0) + || (psShape->panPartStart[i] > 0 && psShape->nVertices == 0) ) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : panPartStart[%d] = %d, nVertices = %d", + hEntity, i, psShape->panPartStart[i], psShape->nVertices); + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + if (i > 0 && psShape->panPartStart[i] <= psShape->panPartStart[i-1]) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : panPartStart[%d] = %d, panPartStart[%d] = %d", + hEntity, i, psShape->panPartStart[i], i - 1, psShape->panPartStart[i - 1]); + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + } + + nOffset = 44 + 8 + 4*nParts; + +/* -------------------------------------------------------------------- */ +/* If this is a multipatch, we will also have parts types. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_MULTIPATCH ) + { + memcpy( psShape->panPartType, psSHP->pabyRec + nOffset, 4*nParts ); + for( i = 0; (int32)i < nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, psShape->panPartType+i ); + } + + nOffset += 4*nParts; + } + +/* -------------------------------------------------------------------- */ +/* Copy out the vertices from the record. */ +/* -------------------------------------------------------------------- */ + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy(psShape->padfX + i, + psSHP->pabyRec + nOffset + i * 16, + 8 ); + + memcpy(psShape->padfY + i, + psSHP->pabyRec + nOffset + i * 16 + 8, + 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); + if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); + } + + nOffset += 16*nPoints; + +/* -------------------------------------------------------------------- */ +/* If we have a Z coordinate, collect that now. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_POLYGONZ + || psShape->nSHPType == SHPT_ARCZ + || psShape->nSHPType == SHPT_MULTIPATCH ) + { + memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); + + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy( psShape->padfZ + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); + } + + nOffset += 16 + 8*nPoints; + } + else if( psShape->bFastModeReadObject ) + { + psShape->padfZ = NULL; + } + +/* -------------------------------------------------------------------- */ +/* If we have a M measure value, then read it now. We assume */ +/* that the measure can be present for any shape if the size is */ +/* big enough, but really it will only occur for the Z shapes */ +/* (options), and the M shapes. */ +/* -------------------------------------------------------------------- */ + if( nEntitySize >= (int)(nOffset + 16 + 8*nPoints) ) + { + memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); + + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy( psShape->padfM + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); + } + psShape->bMeasureIsUsed = TRUE; + } + else if( psShape->bFastModeReadObject ) + { + psShape->padfM = NULL; + } + } + +/* ==================================================================== */ +/* Extract vertices for a MultiPoint. */ +/* ==================================================================== */ + else if( psShape->nSHPType == SHPT_MULTIPOINT + || psShape->nSHPType == SHPT_MULTIPOINTM + || psShape->nSHPType == SHPT_MULTIPOINTZ ) + { + int32 nPoints; + int i, nOffset; + unsigned char* pBuffer = NULL; + unsigned char** ppBuffer = NULL; + + if ( 44 + 4 > nEntitySize ) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + memcpy( &nPoints, psSHP->pabyRec + 44, 4 ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + + /* nPoints is unsigned */ + if (/* nPoints < 0 || */ nPoints > 50 * 1000 * 1000) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nPoints = %u", + hEntity, nPoints); + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + nRequiredSize = 48 + nPoints * 16; + if( psShape->nSHPType == SHPT_MULTIPOINTZ ) + { + nRequiredSize += 16 + nPoints * 8; + } + if (nRequiredSize > nEntitySize) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nPoints = %u, nEntitySize = %d", + hEntity, nPoints, nEntitySize); + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + if( psShape->bFastModeReadObject ) + { + int nObjectBufSize = 4 * sizeof(double) * nPoints; + pBuffer = SHPReallocObjectBufIfNecessary(psSHP, nObjectBufSize); + ppBuffer = &pBuffer; + } + + psShape->nVertices = nPoints; + + psShape->padfX = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfY = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfZ = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfM = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + + if (psShape->padfX == NULL || + psShape->padfY == NULL || + psShape->padfZ == NULL || + psShape->padfM == NULL) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Not enough memory to allocate requested memory (nPoints=%u) for shape %d. " + "Probably broken SHP file", nPoints, hEntity ); + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy(psShape->padfX+i, psSHP->pabyRec + 48 + 16 * i, 8 ); + memcpy(psShape->padfY+i, psSHP->pabyRec + 48 + 16 * i + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); + if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); + } + + nOffset = 48 + 16*nPoints; + +/* -------------------------------------------------------------------- */ +/* Get the X/Y bounds. */ +/* -------------------------------------------------------------------- */ + memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); + memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); + memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); + memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); + +/* -------------------------------------------------------------------- */ +/* If we have a Z coordinate, collect that now. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_MULTIPOINTZ ) + { + memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); + + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy( psShape->padfZ + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); + } + + nOffset += 16 + 8*nPoints; + } + else if( psShape->bFastModeReadObject ) + psShape->padfZ = NULL; + +/* -------------------------------------------------------------------- */ +/* If we have a M measure value, then read it now. We assume */ +/* that the measure can be present for any shape if the size is */ +/* big enough, but really it will only occur for the Z shapes */ +/* (options), and the M shapes. */ +/* -------------------------------------------------------------------- */ + if( nEntitySize >= (int)(nOffset + 16 + 8*nPoints) ) + { + memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); + + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy( psShape->padfM + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); + } + psShape->bMeasureIsUsed = TRUE; + } + else if( psShape->bFastModeReadObject ) + psShape->padfM = NULL; + } + +/* ==================================================================== */ +/* Extract vertices for a point. */ +/* ==================================================================== */ + else if( psShape->nSHPType == SHPT_POINT + || psShape->nSHPType == SHPT_POINTM + || psShape->nSHPType == SHPT_POINTZ ) + { + int nOffset; + + psShape->nVertices = 1; + if( psShape->bFastModeReadObject ) + { + psShape->padfX = &(psShape->dfXMin); + psShape->padfY = &(psShape->dfYMin); + psShape->padfZ = &(psShape->dfZMin); + psShape->padfM = &(psShape->dfMMin); + psShape->padfZ[0] = 0.0; + psShape->padfM[0] = 0.0; + } + else + { + psShape->padfX = (double *) calloc(1,sizeof(double)); + psShape->padfY = (double *) calloc(1,sizeof(double)); + psShape->padfZ = (double *) calloc(1,sizeof(double)); + psShape->padfM = (double *) calloc(1,sizeof(double)); + } + + if (20 + 8 + (( psShape->nSHPType == SHPT_POINTZ ) ? 8 : 0)> nEntitySize) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + memcpy( psShape->padfX, psSHP->pabyRec + 12, 8 ); + memcpy( psShape->padfY, psSHP->pabyRec + 20, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfX ); + if( bBigEndian ) SwapWord( 8, psShape->padfY ); + + nOffset = 20 + 8; + +/* -------------------------------------------------------------------- */ +/* If we have a Z coordinate, collect that now. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_POINTZ ) + { + memcpy( psShape->padfZ, psSHP->pabyRec + nOffset, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfZ ); + + nOffset += 8; + } + +/* -------------------------------------------------------------------- */ +/* If we have a M measure value, then read it now. We assume */ +/* that the measure can be present for any shape if the size is */ +/* big enough, but really it will only occur for the Z shapes */ +/* (options), and the M shapes. */ +/* -------------------------------------------------------------------- */ + if( nEntitySize >= nOffset + 8 ) + { + memcpy( psShape->padfM, psSHP->pabyRec + nOffset, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfM ); + psShape->bMeasureIsUsed = TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Since no extents are supplied in the record, we will apply */ +/* them from the single vertex. */ +/* -------------------------------------------------------------------- */ + psShape->dfXMin = psShape->dfXMax = psShape->padfX[0]; + psShape->dfYMin = psShape->dfYMax = psShape->padfY[0]; + psShape->dfZMin = psShape->dfZMax = psShape->padfZ[0]; + psShape->dfMMin = psShape->dfMMax = psShape->padfM[0]; + } + + return( psShape ); +} + +/************************************************************************/ +/* SHPTypeName() */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +SHPTypeName( int nSHPType ) + +{ + switch( nSHPType ) + { + case SHPT_NULL: + return "NullShape"; + + case SHPT_POINT: + return "Point"; + + case SHPT_ARC: + return "Arc"; + + case SHPT_POLYGON: + return "Polygon"; + + case SHPT_MULTIPOINT: + return "MultiPoint"; + + case SHPT_POINTZ: + return "PointZ"; + + case SHPT_ARCZ: + return "ArcZ"; + + case SHPT_POLYGONZ: + return "PolygonZ"; + + case SHPT_MULTIPOINTZ: + return "MultiPointZ"; + + case SHPT_POINTM: + return "PointM"; + + case SHPT_ARCM: + return "ArcM"; + + case SHPT_POLYGONM: + return "PolygonM"; + + case SHPT_MULTIPOINTM: + return "MultiPointM"; + + case SHPT_MULTIPATCH: + return "MultiPatch"; + + default: + return "UnknownShapeType"; + } +} + +/************************************************************************/ +/* SHPPartTypeName() */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +SHPPartTypeName( int nPartType ) + +{ + switch( nPartType ) + { + case SHPP_TRISTRIP: + return "TriangleStrip"; + + case SHPP_TRIFAN: + return "TriangleFan"; + + case SHPP_OUTERRING: + return "OuterRing"; + + case SHPP_INNERRING: + return "InnerRing"; + + case SHPP_FIRSTRING: + return "FirstRing"; + + case SHPP_RING: + return "Ring"; + + default: + return "UnknownPartType"; + } +} + +/************************************************************************/ +/* SHPDestroyObject() */ +/************************************************************************/ + +void SHPAPI_CALL +SHPDestroyObject( SHPObject * psShape ) + +{ + if( psShape == NULL ) + return; + + if( psShape->bFastModeReadObject ) + { + psShape->bFastModeReadObject = FALSE; + return; + } + + if( psShape->padfX != NULL ) + free( psShape->padfX ); + if( psShape->padfY != NULL ) + free( psShape->padfY ); + if( psShape->padfZ != NULL ) + free( psShape->padfZ ); + if( psShape->padfM != NULL ) + free( psShape->padfM ); + + if( psShape->panPartStart != NULL ) + free( psShape->panPartStart ); + if( psShape->panPartType != NULL ) + free( psShape->panPartType ); + + free( psShape ); +} + +/************************************************************************/ +/* SHPRewindObject() */ +/* */ +/* Reset the winding of polygon objects to adhere to the */ +/* specification. */ +/************************************************************************/ + +int SHPAPI_CALL +SHPRewindObject( CPL_UNUSED SHPHandle hSHP, + SHPObject * psObject ) +{ + int iOpRing, bAltered = 0; + +/* -------------------------------------------------------------------- */ +/* Do nothing if this is not a polygon object. */ +/* -------------------------------------------------------------------- */ + if( psObject->nSHPType != SHPT_POLYGON + && psObject->nSHPType != SHPT_POLYGONZ + && psObject->nSHPType != SHPT_POLYGONM ) + return 0; + + if( psObject->nVertices == 0 || psObject->nParts == 0 ) + return 0; + +/* -------------------------------------------------------------------- */ +/* Process each of the rings. */ +/* -------------------------------------------------------------------- */ + for( iOpRing = 0; iOpRing < psObject->nParts; iOpRing++ ) + { + int bInner, iVert, nVertCount, nVertStart, iCheckRing; + double dfSum, dfTestX, dfTestY; + +/* -------------------------------------------------------------------- */ +/* Determine if this ring is an inner ring or an outer ring */ +/* relative to all the other rings. For now we assume the */ +/* first ring is outer and all others are inner, but eventually */ +/* we need to fix this to handle multiple island polygons and */ +/* unordered sets of rings. */ +/* */ +/* -------------------------------------------------------------------- */ + + /* Use point in the middle of segment to avoid testing + * common points of rings. + */ + dfTestX = ( psObject->padfX[psObject->panPartStart[iOpRing]] + + psObject->padfX[psObject->panPartStart[iOpRing] + 1] ) / 2; + dfTestY = ( psObject->padfY[psObject->panPartStart[iOpRing]] + + psObject->padfY[psObject->panPartStart[iOpRing] + 1] ) / 2; + + bInner = FALSE; + for( iCheckRing = 0; iCheckRing < psObject->nParts; iCheckRing++ ) + { + int iEdge; + + if( iCheckRing == iOpRing ) + continue; + + nVertStart = psObject->panPartStart[iCheckRing]; + + if( iCheckRing == psObject->nParts-1 ) + nVertCount = psObject->nVertices + - psObject->panPartStart[iCheckRing]; + else + nVertCount = psObject->panPartStart[iCheckRing+1] + - psObject->panPartStart[iCheckRing]; + + for( iEdge = 0; iEdge < nVertCount; iEdge++ ) + { + int iNext; + + if( iEdge < nVertCount-1 ) + iNext = iEdge+1; + else + iNext = 0; + + /* Rule #1: + * Test whether the edge 'straddles' the horizontal ray from the test point (dfTestY,dfTestY) + * The rule #1 also excludes edges colinear with the ray. + */ + if ( ( psObject->padfY[iEdge+nVertStart] < dfTestY + && dfTestY <= psObject->padfY[iNext+nVertStart] ) + || ( psObject->padfY[iNext+nVertStart] < dfTestY + && dfTestY <= psObject->padfY[iEdge+nVertStart] ) ) + { + /* Rule #2: + * Test if edge-ray intersection is on the right from the test point (dfTestY,dfTestY) + */ + double const intersect = + ( psObject->padfX[iEdge+nVertStart] + + ( dfTestY - psObject->padfY[iEdge+nVertStart] ) + / ( psObject->padfY[iNext+nVertStart] - psObject->padfY[iEdge+nVertStart] ) + * ( psObject->padfX[iNext+nVertStart] - psObject->padfX[iEdge+nVertStart] ) ); + + if (intersect < dfTestX) + { + bInner = !bInner; + } + } + } + } /* for iCheckRing */ + +/* -------------------------------------------------------------------- */ +/* Determine the current order of this ring so we will know if */ +/* it has to be reversed. */ +/* -------------------------------------------------------------------- */ + nVertStart = psObject->panPartStart[iOpRing]; + + if( iOpRing == psObject->nParts-1 ) + nVertCount = psObject->nVertices - psObject->panPartStart[iOpRing]; + else + nVertCount = psObject->panPartStart[iOpRing+1] + - psObject->panPartStart[iOpRing]; + + if (nVertCount < 2) + continue; + + dfSum = psObject->padfX[nVertStart] * (psObject->padfY[nVertStart+1] - psObject->padfY[nVertStart+nVertCount-1]); + for( iVert = nVertStart + 1; iVert < nVertStart+nVertCount-1; iVert++ ) + { + dfSum += psObject->padfX[iVert] * (psObject->padfY[iVert+1] - psObject->padfY[iVert-1]); + } + + dfSum += psObject->padfX[iVert] * (psObject->padfY[nVertStart] - psObject->padfY[iVert-1]); + +/* -------------------------------------------------------------------- */ +/* Reverse if necessary. */ +/* -------------------------------------------------------------------- */ + if( (dfSum < 0.0 && bInner) || (dfSum > 0.0 && !bInner) ) + { + int i; + + bAltered++; + for( i = 0; i < nVertCount/2; i++ ) + { + double dfSaved; + + /* Swap X */ + dfSaved = psObject->padfX[nVertStart+i]; + psObject->padfX[nVertStart+i] = + psObject->padfX[nVertStart+nVertCount-i-1]; + psObject->padfX[nVertStart+nVertCount-i-1] = dfSaved; + + /* Swap Y */ + dfSaved = psObject->padfY[nVertStart+i]; + psObject->padfY[nVertStart+i] = + psObject->padfY[nVertStart+nVertCount-i-1]; + psObject->padfY[nVertStart+nVertCount-i-1] = dfSaved; + + /* Swap Z */ + if( psObject->padfZ ) + { + dfSaved = psObject->padfZ[nVertStart+i]; + psObject->padfZ[nVertStart+i] = + psObject->padfZ[nVertStart+nVertCount-i-1]; + psObject->padfZ[nVertStart+nVertCount-i-1] = dfSaved; + } + + /* Swap M */ + if( psObject->padfM ) + { + dfSaved = psObject->padfM[nVertStart+i]; + psObject->padfM[nVertStart+i] = + psObject->padfM[nVertStart+nVertCount-i-1]; + psObject->padfM[nVertStart+nVertCount-i-1] = dfSaved; + } + } + } + } + + return bAltered; +} diff --git a/support/ShapeLib/shprewind.c b/support/ShapeLib/shprewind.c new file mode 100644 index 00000000..20acc01d --- /dev/null +++ b/support/ShapeLib/shprewind.c @@ -0,0 +1,121 @@ +/****************************************************************************** + * $Id: shprewind.c,v 1.5 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Utility to validate and reset the winding order of rings in + * polygon geometries to match the ordering required by spec. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 2002, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: shprewind.c,v $ + * Revision 1.5 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.4 2004-09-26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.3 2004/01/09 16:39:49 fwarmerdam + * include standard include files + * + * Revision 1.2 2002/04/10 17:23:11 warmerda + * copy from source to destination now + * + * Revision 1.1 2002/04/10 16:56:36 warmerda + * New + * + */ + +#include +#include +#include "shapefil.h" + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP, hSHPOut; + int nShapeType, nEntities, i, nInvalidCount=0; + double adfMinBound[4], adfMaxBound[4]; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 3 ) + { + printf( "shprewind in_shp_file out_shp_file\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( argv[1], "rb" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( hSHP, &nEntities, &nShapeType, adfMinBound, adfMaxBound ); + +/* -------------------------------------------------------------------- */ +/* Create output shapefile. */ +/* -------------------------------------------------------------------- */ + hSHPOut = SHPCreate( argv[2], nShapeType ); + + if( hSHPOut == NULL ) + { + printf( "Unable to create:%s\n", argv[2] ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Skim over the list of shapes, printing all the vertices. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < nEntities; i++ ) + { + SHPObject *psShape; + + psShape = SHPReadObject( hSHP, i ); + if( SHPRewindObject( hSHP, psShape ) ) + nInvalidCount++; + SHPWriteObject( hSHPOut, -1, psShape ); + SHPDestroyObject( psShape ); + } + + SHPClose( hSHP ); + SHPClose( hSHPOut ); + + printf( "%d objects rewound.\n", nInvalidCount ); + + exit( 0 ); +} diff --git a/support/ShapeLib/shptest.c b/support/ShapeLib/shptest.c new file mode 100644 index 00000000..f6008677 --- /dev/null +++ b/support/ShapeLib/shptest.c @@ -0,0 +1,314 @@ +/****************************************************************************** + * $Id: shptest.c,v 1.8 2016-12-05 12:44:06 erouault Exp $ + * + * Project: Shapelib + * Purpose: Application for generating sample Shapefiles of various types. + * Used by the stream2.sh test script. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: shptest.c,v $ + * Revision 1.8 2016-12-05 12:44:06 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.7 2004-09-26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.6 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.5 2001/06/22 02:18:20 warmerda + * Added null shape support + * + * Revision 1.4 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.3 1999/11/05 14:12:05 warmerda + * updated license terms + * + * Revision 1.2 1998/12/16 05:15:20 warmerda + * Added support for writing multipatch. + * + * Revision 1.1 1998/11/09 20:18:42 warmerda + * Initial revision + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: shptest.c,v 1.8 2016-12-05 12:44:06 erouault Exp $") + +/************************************************************************/ +/* Test_WritePoints() */ +/* */ +/* Write a small point file. */ +/************************************************************************/ + +static void Test_WritePoints( int nSHPType, const char *pszFilename ) + +{ + SHPHandle hSHPHandle; + SHPObject *psShape; + double x, y, z, m; + + hSHPHandle = SHPCreate( pszFilename, nSHPType ); + + x = 1.0; + y = 2.0; + z = 3.0; + m = 4.0; + psShape = SHPCreateObject( nSHPType, -1, 0, NULL, NULL, + 1, &x, &y, &z, &m ); + SHPWriteObject( hSHPHandle, -1, psShape ); + SHPDestroyObject( psShape ); + + x = 10.0; + y = 20.0; + z = 30.0; + m = 40.0; + psShape = SHPCreateObject( nSHPType, -1, 0, NULL, NULL, + 1, &x, &y, &z, &m ); + SHPWriteObject( hSHPHandle, -1, psShape ); + SHPDestroyObject( psShape ); + + SHPClose( hSHPHandle ); +} + +/************************************************************************/ +/* Test_WriteMultiPoints() */ +/* */ +/* Write a small multipoint file. */ +/************************************************************************/ + +static void Test_WriteMultiPoints( int nSHPType, const char *pszFilename ) + +{ + SHPHandle hSHPHandle; + SHPObject *psShape; + double x[4], y[4], z[4], m[4]; + int i, iShape; + + hSHPHandle = SHPCreate( pszFilename, nSHPType ); + + for( iShape = 0; iShape < 3; iShape++ ) + { + for( i = 0; i < 4; i++ ) + { + x[i] = iShape * 10 + i + 1.15; + y[i] = iShape * 10 + i + 2.25; + z[i] = iShape * 10 + i + 3.35; + m[i] = iShape * 10 + i + 4.45; + } + + psShape = SHPCreateObject( nSHPType, -1, 0, NULL, NULL, + 4, x, y, z, m ); + SHPWriteObject( hSHPHandle, -1, psShape ); + SHPDestroyObject( psShape ); + } + + SHPClose( hSHPHandle ); +} + +/************************************************************************/ +/* Test_WriteArcPoly() */ +/* */ +/* Write a small arc or polygon file. */ +/************************************************************************/ + +static void Test_WriteArcPoly( int nSHPType, const char *pszFilename ) + +{ + SHPHandle hSHPHandle; + SHPObject *psShape; + double x[100], y[100], z[100], m[100]; + int anPartStart[100]; + int anPartType[100], *panPartType; + int i, iShape; + + hSHPHandle = SHPCreate( pszFilename, nSHPType ); + + if( nSHPType == SHPT_MULTIPATCH ) + panPartType = anPartType; + else + panPartType = NULL; + + for( iShape = 0; iShape < 3; iShape++ ) + { + x[0] = 1.0; + y[0] = 1.0+iShape*3; + x[1] = 2.0; + y[1] = 1.0+iShape*3; + x[2] = 2.0; + y[2] = 2.0+iShape*3; + x[3] = 1.0; + y[3] = 2.0+iShape*3; + x[4] = 1.0; + y[4] = 1.0+iShape*3; + + for( i = 0; i < 5; i++ ) + { + z[i] = iShape * 10 + i + 3.35; + m[i] = iShape * 10 + i + 4.45; + } + + psShape = SHPCreateObject( nSHPType, -1, 0, NULL, NULL, + 5, x, y, z, m ); + SHPWriteObject( hSHPHandle, -1, psShape ); + SHPDestroyObject( psShape ); + } + +/* -------------------------------------------------------------------- */ +/* Do a multi part polygon (shape). We close it, and have two */ +/* inner rings. */ +/* -------------------------------------------------------------------- */ + x[0] = 0.0; + y[0] = 0.0; + x[1] = 0; + y[1] = 100; + x[2] = 100; + y[2] = 100; + x[3] = 100; + y[3] = 0; + x[4] = 0; + y[4] = 0; + + x[5] = 10; + y[5] = 20; + x[6] = 30; + y[6] = 20; + x[7] = 30; + y[7] = 40; + x[8] = 10; + y[8] = 40; + x[9] = 10; + y[9] = 20; + + x[10] = 60; + y[10] = 20; + x[11] = 90; + y[11] = 20; + x[12] = 90; + y[12] = 40; + x[13] = 60; + y[13] = 40; + x[14] = 60; + y[14] = 20; + + for( i = 0; i < 15; i++ ) + { + z[i] = i; + m[i] = i*2; + } + + anPartStart[0] = 0; + anPartStart[1] = 5; + anPartStart[2] = 10; + + anPartType[0] = SHPP_RING; + anPartType[1] = SHPP_INNERRING; + anPartType[2] = SHPP_INNERRING; + + psShape = SHPCreateObject( nSHPType, -1, 3, anPartStart, panPartType, + 15, x, y, z, m ); + SHPWriteObject( hSHPHandle, -1, psShape ); + SHPDestroyObject( psShape ); + + + SHPClose( hSHPHandle ); +} + +/************************************************************************/ +/* main() */ +/************************************************************************/ +int main( int argc, char ** argv ) + +{ +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 2 ) + { + printf( "shptest test_number\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Figure out which test to run. */ +/* -------------------------------------------------------------------- */ + + if( atoi(argv[1]) == 0 ) + Test_WritePoints( SHPT_NULL, "test0.shp" ); + + else if( atoi(argv[1]) == 1 ) + Test_WritePoints( SHPT_POINT, "test1.shp" ); + else if( atoi(argv[1]) == 2 ) + Test_WritePoints( SHPT_POINTZ, "test2.shp" ); + else if( atoi(argv[1]) == 3 ) + Test_WritePoints( SHPT_POINTM, "test3.shp" ); + + else if( atoi(argv[1]) == 4 ) + Test_WriteMultiPoints( SHPT_MULTIPOINT, "test4.shp" ); + else if( atoi(argv[1]) == 5 ) + Test_WriteMultiPoints( SHPT_MULTIPOINTZ, "test5.shp" ); + else if( atoi(argv[1]) == 6 ) + Test_WriteMultiPoints( SHPT_MULTIPOINTM, "test6.shp" ); + + else if( atoi(argv[1]) == 7 ) + Test_WriteArcPoly( SHPT_ARC, "test7.shp" ); + else if( atoi(argv[1]) == 8 ) + Test_WriteArcPoly( SHPT_ARCZ, "test8.shp" ); + else if( atoi(argv[1]) == 9 ) + Test_WriteArcPoly( SHPT_ARCM, "test9.shp" ); + + else if( atoi(argv[1]) == 10 ) + Test_WriteArcPoly( SHPT_POLYGON, "test10.shp" ); + else if( atoi(argv[1]) == 11 ) + Test_WriteArcPoly( SHPT_POLYGONZ, "test11.shp" ); + else if( atoi(argv[1]) == 12 ) + Test_WriteArcPoly( SHPT_POLYGONM, "test12.shp" ); + + else if( atoi(argv[1]) == 13 ) + Test_WriteArcPoly( SHPT_MULTIPATCH, "test13.shp" ); + else + { + printf( "Test `%s' not recognised.\n", argv[1] ); + exit( 10 ); + } + +#ifdef USE_DBMALLOC + malloc_dump(2); +#endif + + exit( 0 ); +} diff --git a/support/ShapeLib/shptree.c b/support/ShapeLib/shptree.c new file mode 100644 index 00000000..d81533c9 --- /dev/null +++ b/support/ShapeLib/shptree.c @@ -0,0 +1,1266 @@ +/****************************************************************************** + * $Id: shptree.c,v 1.19 2016-12-05 12:44:06 erouault Exp $ + * + * Project: Shapelib + * Purpose: Implementation of quadtree building and searching functions. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * Copyright (c) 2012, Even Rouault + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: shptree.c,v $ + * Revision 1.19 2016-12-05 12:44:06 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.18 2016-12-04 15:30:15 erouault + * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with + * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo + * structures extended with new members. New functions: + * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, + * SHPSetFastModeReadObject + * + * * sbnsearch.c: new file to implement original ESRI .sbn spatial + * index reading. (no write support). New functions: + * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, + * SBNSearchDiskTreeInteger, SBNSearchFreeIds + * + * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates + * with new file and symbols. + * + * * commit: helper script to cvs commit + * + * Revision 1.17 2012-01-27 21:09:26 fwarmerdam + * optimize .qix output (gdal #4472) + * + * Revision 1.16 2011-12-11 22:26:46 fwarmerdam + * upgrade .qix access code to use SAHooks (gdal #3365) + * + * Revision 1.15 2011-07-24 05:59:25 fwarmerdam + * minimize use of CPLError in favor of SAHooks.Error() + * + * Revision 1.14 2010-08-27 23:43:27 fwarmerdam + * add SHPAPI_CALL attribute in code + * + * Revision 1.13 2010-06-29 05:50:15 fwarmerdam + * fix sign of Z/M comparisons in SHPCheckObjectContained (#2223) + * + * Revision 1.12 2008-11-12 15:39:50 fwarmerdam + * improve safety in face of buggy .shp file. + * + * Revision 1.11 2007/10/27 03:31:14 fwarmerdam + * limit default depth of tree to 12 levels (gdal ticket #1594) + * + * Revision 1.10 2005/01/03 22:30:13 fwarmerdam + * added support for saved quadtrees + * + * Revision 1.9 2003/01/28 15:53:41 warmerda + * Avoid build warnings. + * + * Revision 1.8 2002/05/07 13:07:45 warmerda + * use qsort() - patch from Bernhard Herzog + * + * Revision 1.7 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.6 2001/05/23 13:36:52 warmerda + * added use of SHPAPI_CALL + * + * Revision 1.5 1999/11/05 14:12:05 warmerda + * updated license terms + * + * Revision 1.4 1999/06/02 18:24:21 warmerda + * added trimming code + * + * Revision 1.3 1999/06/02 17:56:12 warmerda + * added quad'' subnode support for trees + * + * Revision 1.2 1999/05/18 19:11:11 warmerda + * Added example searching capability + * + * Revision 1.1 1999/05/18 17:49:20 warmerda + * New + * + */ + +#include "shapefil.h" + +#include +#include +#include +#include +#include + +#ifdef USE_CPL +#include "cpl_error.h" +#endif + +SHP_CVSID("$Id: shptree.c,v 1.19 2016-12-05 12:44:06 erouault Exp $") + +#ifndef TRUE +# define TRUE 1 +# define FALSE 0 +#endif + +static int bBigEndian = 0; + + +/* -------------------------------------------------------------------- */ +/* If the following is 0.5, nodes will be split in half. If it */ +/* is 0.6 then each subnode will contain 60% of the parent */ +/* node, with 20% representing overlap. This can be help to */ +/* prevent small objects on a boundary from shifting too high */ +/* up the tree. */ +/* -------------------------------------------------------------------- */ + +#define SHP_SPLIT_RATIO 0.55 + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ + +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + +/************************************************************************/ +/* SHPTreeNodeInit() */ +/* */ +/* Initialize a tree node. */ +/************************************************************************/ + +static SHPTreeNode *SHPTreeNodeCreate( double * padfBoundsMin, + double * padfBoundsMax ) + +{ + SHPTreeNode *psTreeNode; + + psTreeNode = (SHPTreeNode *) malloc(sizeof(SHPTreeNode)); + if( NULL == psTreeNode ) + return NULL; + + psTreeNode->nShapeCount = 0; + psTreeNode->panShapeIds = NULL; + psTreeNode->papsShapeObj = NULL; + + psTreeNode->nSubNodes = 0; + + if( padfBoundsMin != NULL ) + memcpy( psTreeNode->adfBoundsMin, padfBoundsMin, sizeof(double) * 4 ); + + if( padfBoundsMax != NULL ) + memcpy( psTreeNode->adfBoundsMax, padfBoundsMax, sizeof(double) * 4 ); + + return psTreeNode; +} + + +/************************************************************************/ +/* SHPCreateTree() */ +/************************************************************************/ + +SHPTree SHPAPI_CALL1(*) + SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, + double *padfBoundsMin, double *padfBoundsMax ) + +{ + SHPTree *psTree; + + if( padfBoundsMin == NULL && hSHP == NULL ) + return NULL; + +/* -------------------------------------------------------------------- */ +/* Allocate the tree object */ +/* -------------------------------------------------------------------- */ + psTree = (SHPTree *) malloc(sizeof(SHPTree)); + if( NULL == psTree ) + { + return NULL; + } + + psTree->hSHP = hSHP; + psTree->nMaxDepth = nMaxDepth; + psTree->nDimension = nDimension; + psTree->nTotalCount = 0; + +/* -------------------------------------------------------------------- */ +/* If no max depth was defined, try to select a reasonable one */ +/* that implies approximately 8 shapes per node. */ +/* -------------------------------------------------------------------- */ + if( psTree->nMaxDepth == 0 && hSHP != NULL ) + { + int nMaxNodeCount = 1; + int nShapeCount; + + SHPGetInfo( hSHP, &nShapeCount, NULL, NULL, NULL ); + while( nMaxNodeCount*4 < nShapeCount ) + { + psTree->nMaxDepth += 1; + nMaxNodeCount = nMaxNodeCount * 2; + } + +#ifdef USE_CPL + CPLDebug( "Shape", + "Estimated spatial index tree depth: %d", + psTree->nMaxDepth ); +#endif + + /* NOTE: Due to problems with memory allocation for deep trees, + * automatically estimated depth is limited up to 12 levels. + * See Ticket #1594 for detailed discussion. + */ + if( psTree->nMaxDepth > MAX_DEFAULT_TREE_DEPTH ) + { + psTree->nMaxDepth = MAX_DEFAULT_TREE_DEPTH; + +#ifdef USE_CPL + CPLDebug( "Shape", + "Falling back to max number of allowed index tree levels (%d).", + MAX_DEFAULT_TREE_DEPTH ); +#endif + } + } + +/* -------------------------------------------------------------------- */ +/* Allocate the root node. */ +/* -------------------------------------------------------------------- */ + psTree->psRoot = SHPTreeNodeCreate( padfBoundsMin, padfBoundsMax ); + if( NULL == psTree->psRoot ) + { + free( psTree ); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Assign the bounds to the root node. If none are passed in, */ +/* use the bounds of the provided file otherwise the create */ +/* function will have already set the bounds. */ +/* -------------------------------------------------------------------- */ + if( padfBoundsMin == NULL ) + { + SHPGetInfo( hSHP, NULL, NULL, + psTree->psRoot->adfBoundsMin, + psTree->psRoot->adfBoundsMax ); + } + +/* -------------------------------------------------------------------- */ +/* If we have a file, insert all it's shapes into the tree. */ +/* -------------------------------------------------------------------- */ + if( hSHP != NULL ) + { + int iShape, nShapeCount; + + SHPGetInfo( hSHP, &nShapeCount, NULL, NULL, NULL ); + + for( iShape = 0; iShape < nShapeCount; iShape++ ) + { + SHPObject *psShape; + + psShape = SHPReadObject( hSHP, iShape ); + if( psShape != NULL ) + { + SHPTreeAddShapeId( psTree, psShape ); + SHPDestroyObject( psShape ); + } + } + } + + return psTree; +} + +/************************************************************************/ +/* SHPDestroyTreeNode() */ +/************************************************************************/ + +static void SHPDestroyTreeNode( SHPTreeNode * psTreeNode ) + +{ + int i; + + assert( NULL != psTreeNode ); + + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( psTreeNode->apsSubNode[i] != NULL ) + SHPDestroyTreeNode( psTreeNode->apsSubNode[i] ); + } + + if( psTreeNode->panShapeIds != NULL ) + free( psTreeNode->panShapeIds ); + + if( psTreeNode->papsShapeObj != NULL ) + { + for( i = 0; i < psTreeNode->nShapeCount; i++ ) + { + if( psTreeNode->papsShapeObj[i] != NULL ) + SHPDestroyObject( psTreeNode->papsShapeObj[i] ); + } + + free( psTreeNode->papsShapeObj ); + } + + free( psTreeNode ); +} + +/************************************************************************/ +/* SHPDestroyTree() */ +/************************************************************************/ + +void SHPAPI_CALL +SHPDestroyTree( SHPTree * psTree ) + +{ + SHPDestroyTreeNode( psTree->psRoot ); + free( psTree ); +} + +/************************************************************************/ +/* SHPCheckBoundsOverlap() */ +/* */ +/* Do the given boxes overlap at all? */ +/************************************************************************/ + +int SHPAPI_CALL +SHPCheckBoundsOverlap( double * padfBox1Min, double * padfBox1Max, + double * padfBox2Min, double * padfBox2Max, + int nDimension ) + +{ + int iDim; + + for( iDim = 0; iDim < nDimension; iDim++ ) + { + if( padfBox2Max[iDim] < padfBox1Min[iDim] ) + return FALSE; + + if( padfBox1Max[iDim] < padfBox2Min[iDim] ) + return FALSE; + } + + return TRUE; +} + +/************************************************************************/ +/* SHPCheckObjectContained() */ +/* */ +/* Does the given shape fit within the indicated extents? */ +/************************************************************************/ + +static int SHPCheckObjectContained( SHPObject * psObject, int nDimension, + double * padfBoundsMin, double * padfBoundsMax ) + +{ + if( psObject->dfXMin < padfBoundsMin[0] + || psObject->dfXMax > padfBoundsMax[0] ) + return FALSE; + + if( psObject->dfYMin < padfBoundsMin[1] + || psObject->dfYMax > padfBoundsMax[1] ) + return FALSE; + + if( nDimension == 2 ) + return TRUE; + + if( psObject->dfZMin < padfBoundsMin[2] + || psObject->dfZMax > padfBoundsMax[2] ) + return FALSE; + + if( nDimension == 3 ) + return TRUE; + + if( psObject->dfMMin < padfBoundsMin[3] + || psObject->dfMMax > padfBoundsMax[3] ) + return FALSE; + + return TRUE; +} + +/************************************************************************/ +/* SHPTreeSplitBounds() */ +/* */ +/* Split a region into two subregion evenly, cutting along the */ +/* longest dimension. */ +/************************************************************************/ + +static void +SHPTreeSplitBounds( double *padfBoundsMinIn, double *padfBoundsMaxIn, + double *padfBoundsMin1, double * padfBoundsMax1, + double *padfBoundsMin2, double * padfBoundsMax2 ) + +{ +/* -------------------------------------------------------------------- */ +/* The output bounds will be very similar to the input bounds, */ +/* so just copy over to start. */ +/* -------------------------------------------------------------------- */ + memcpy( padfBoundsMin1, padfBoundsMinIn, sizeof(double) * 4 ); + memcpy( padfBoundsMax1, padfBoundsMaxIn, sizeof(double) * 4 ); + memcpy( padfBoundsMin2, padfBoundsMinIn, sizeof(double) * 4 ); + memcpy( padfBoundsMax2, padfBoundsMaxIn, sizeof(double) * 4 ); + +/* -------------------------------------------------------------------- */ +/* Split in X direction. */ +/* -------------------------------------------------------------------- */ + if( (padfBoundsMaxIn[0] - padfBoundsMinIn[0]) + > (padfBoundsMaxIn[1] - padfBoundsMinIn[1]) ) + { + double dfRange = padfBoundsMaxIn[0] - padfBoundsMinIn[0]; + + padfBoundsMax1[0] = padfBoundsMinIn[0] + dfRange * SHP_SPLIT_RATIO; + padfBoundsMin2[0] = padfBoundsMaxIn[0] - dfRange * SHP_SPLIT_RATIO; + } + +/* -------------------------------------------------------------------- */ +/* Otherwise split in Y direction. */ +/* -------------------------------------------------------------------- */ + else + { + double dfRange = padfBoundsMaxIn[1] - padfBoundsMinIn[1]; + + padfBoundsMax1[1] = padfBoundsMinIn[1] + dfRange * SHP_SPLIT_RATIO; + padfBoundsMin2[1] = padfBoundsMaxIn[1] - dfRange * SHP_SPLIT_RATIO; + } +} + +/************************************************************************/ +/* SHPTreeNodeAddShapeId() */ +/************************************************************************/ + +static int +SHPTreeNodeAddShapeId( SHPTreeNode * psTreeNode, SHPObject * psObject, + int nMaxDepth, int nDimension ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* If there are subnodes, then consider whether this object */ +/* will fit in them. */ +/* -------------------------------------------------------------------- */ + if( nMaxDepth > 1 && psTreeNode->nSubNodes > 0 ) + { + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( SHPCheckObjectContained(psObject, nDimension, + psTreeNode->apsSubNode[i]->adfBoundsMin, + psTreeNode->apsSubNode[i]->adfBoundsMax)) + { + return SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[i], + psObject, nMaxDepth-1, + nDimension ); + } + } + } + +/* -------------------------------------------------------------------- */ +/* Otherwise, consider creating four subnodes if could fit into */ +/* them, and adding to the appropriate subnode. */ +/* -------------------------------------------------------------------- */ +#if MAX_SUBNODE == 4 + else if( nMaxDepth > 1 && psTreeNode->nSubNodes == 0 ) + { + double adfBoundsMinH1[4], adfBoundsMaxH1[4]; + double adfBoundsMinH2[4], adfBoundsMaxH2[4]; + double adfBoundsMin1[4], adfBoundsMax1[4]; + double adfBoundsMin2[4], adfBoundsMax2[4]; + double adfBoundsMin3[4], adfBoundsMax3[4]; + double adfBoundsMin4[4], adfBoundsMax4[4]; + + SHPTreeSplitBounds( psTreeNode->adfBoundsMin, + psTreeNode->adfBoundsMax, + adfBoundsMinH1, adfBoundsMaxH1, + adfBoundsMinH2, adfBoundsMaxH2 ); + + SHPTreeSplitBounds( adfBoundsMinH1, adfBoundsMaxH1, + adfBoundsMin1, adfBoundsMax1, + adfBoundsMin2, adfBoundsMax2 ); + + SHPTreeSplitBounds( adfBoundsMinH2, adfBoundsMaxH2, + adfBoundsMin3, adfBoundsMax3, + adfBoundsMin4, adfBoundsMax4 ); + + if( SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin1, adfBoundsMax1) + || SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin2, adfBoundsMax2) + || SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin3, adfBoundsMax3) + || SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin4, adfBoundsMax4) ) + { + psTreeNode->nSubNodes = 4; + psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, + adfBoundsMax1 ); + psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, + adfBoundsMax2 ); + psTreeNode->apsSubNode[2] = SHPTreeNodeCreate( adfBoundsMin3, + adfBoundsMax3 ); + psTreeNode->apsSubNode[3] = SHPTreeNodeCreate( adfBoundsMin4, + adfBoundsMax4 ); + + /* recurse back on this node now that it has subnodes */ + return( SHPTreeNodeAddShapeId( psTreeNode, psObject, + nMaxDepth, nDimension ) ); + } + } +#endif /* MAX_SUBNODE == 4 */ + +/* -------------------------------------------------------------------- */ +/* Otherwise, consider creating two subnodes if could fit into */ +/* them, and adding to the appropriate subnode. */ +/* -------------------------------------------------------------------- */ +#if MAX_SUBNODE == 2 + else if( nMaxDepth > 1 && psTreeNode->nSubNodes == 0 ) + { + double adfBoundsMin1[4], adfBoundsMax1[4]; + double adfBoundsMin2[4], adfBoundsMax2[4]; + + SHPTreeSplitBounds( psTreeNode->adfBoundsMin, psTreeNode->adfBoundsMax, + adfBoundsMin1, adfBoundsMax1, + adfBoundsMin2, adfBoundsMax2 ); + + if( SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin1, adfBoundsMax1)) + { + psTreeNode->nSubNodes = 2; + psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, + adfBoundsMax1 ); + psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, + adfBoundsMax2 ); + + return( SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[0], psObject, + nMaxDepth - 1, nDimension ) ); + } + else if( SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin2, adfBoundsMax2) ) + { + psTreeNode->nSubNodes = 2; + psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, + adfBoundsMax1 ); + psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, + adfBoundsMax2 ); + + return( SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[1], psObject, + nMaxDepth - 1, nDimension ) ); + } + } +#endif /* MAX_SUBNODE == 2 */ + +/* -------------------------------------------------------------------- */ +/* If none of that worked, just add it to this nodes list. */ +/* -------------------------------------------------------------------- */ + psTreeNode->nShapeCount++; + + psTreeNode->panShapeIds = (int *) + SfRealloc( psTreeNode->panShapeIds, + sizeof(int) * psTreeNode->nShapeCount ); + psTreeNode->panShapeIds[psTreeNode->nShapeCount-1] = psObject->nShapeId; + + if( psTreeNode->papsShapeObj != NULL ) + { + psTreeNode->papsShapeObj = (SHPObject **) + SfRealloc( psTreeNode->papsShapeObj, + sizeof(void *) * psTreeNode->nShapeCount ); + psTreeNode->papsShapeObj[psTreeNode->nShapeCount-1] = NULL; + } + + return TRUE; +} + +/************************************************************************/ +/* SHPTreeAddShapeId() */ +/* */ +/* Add a shape to the tree, but don't keep a pointer to the */ +/* object data, just keep the shapeid. */ +/************************************************************************/ + +int SHPAPI_CALL +SHPTreeAddShapeId( SHPTree * psTree, SHPObject * psObject ) + +{ + psTree->nTotalCount++; + + return( SHPTreeNodeAddShapeId( psTree->psRoot, psObject, + psTree->nMaxDepth, psTree->nDimension ) ); +} + +/************************************************************************/ +/* SHPTreeCollectShapesIds() */ +/* */ +/* Work function implementing SHPTreeFindLikelyShapes() on a */ +/* tree node by tree node basis. */ +/************************************************************************/ + +static void +SHPTreeCollectShapeIds( SHPTree *hTree, SHPTreeNode * psTreeNode, + double * padfBoundsMin, double * padfBoundsMax, + int * pnShapeCount, int * pnMaxShapes, + int ** ppanShapeList ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* Does this node overlap the area of interest at all? If not, */ +/* return without adding to the list at all. */ +/* -------------------------------------------------------------------- */ + if( !SHPCheckBoundsOverlap( psTreeNode->adfBoundsMin, + psTreeNode->adfBoundsMax, + padfBoundsMin, + padfBoundsMax, + hTree->nDimension ) ) + return; + +/* -------------------------------------------------------------------- */ +/* Grow the list to hold the shapes on this node. */ +/* -------------------------------------------------------------------- */ + if( *pnShapeCount + psTreeNode->nShapeCount > *pnMaxShapes ) + { + *pnMaxShapes = (*pnShapeCount + psTreeNode->nShapeCount) * 2 + 20; + *ppanShapeList = (int *) + SfRealloc(*ppanShapeList,sizeof(int) * *pnMaxShapes); + } + +/* -------------------------------------------------------------------- */ +/* Add the local nodes shapeids to the list. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < psTreeNode->nShapeCount; i++ ) + { + (*ppanShapeList)[(*pnShapeCount)++] = psTreeNode->panShapeIds[i]; + } + +/* -------------------------------------------------------------------- */ +/* Recurse to subnodes if they exist. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( psTreeNode->apsSubNode[i] != NULL ) + SHPTreeCollectShapeIds( hTree, psTreeNode->apsSubNode[i], + padfBoundsMin, padfBoundsMax, + pnShapeCount, pnMaxShapes, + ppanShapeList ); + } +} + +/************************************************************************/ +/* SHPTreeFindLikelyShapes() */ +/* */ +/* Find all shapes within tree nodes for which the tree node */ +/* bounding box overlaps the search box. The return value is */ +/* an array of shapeids terminated by a -1. The shapeids will */ +/* be in order, as hopefully this will result in faster (more */ +/* sequential) reading from the file. */ +/************************************************************************/ + +/* helper for qsort */ +static int +compare_ints( const void * a, const void * b) +{ + return (*(int*)a) - (*(int*)b); +} + +int SHPAPI_CALL1(*) +SHPTreeFindLikelyShapes( SHPTree * hTree, + double * padfBoundsMin, double * padfBoundsMax, + int * pnShapeCount ) + +{ + int *panShapeList=NULL, nMaxShapes = 0; + +/* -------------------------------------------------------------------- */ +/* Perform the search by recursive descent. */ +/* -------------------------------------------------------------------- */ + *pnShapeCount = 0; + + SHPTreeCollectShapeIds( hTree, hTree->psRoot, + padfBoundsMin, padfBoundsMax, + pnShapeCount, &nMaxShapes, + &panShapeList ); + +/* -------------------------------------------------------------------- */ +/* Sort the id array */ +/* -------------------------------------------------------------------- */ + + if( panShapeList != NULL ) + qsort(panShapeList, *pnShapeCount, sizeof(int), compare_ints); + + return panShapeList; +} + +/************************************************************************/ +/* SHPTreeNodeTrim() */ +/* */ +/* This is the recursive version of SHPTreeTrimExtraNodes() that */ +/* walks the tree cleaning it up. */ +/************************************************************************/ + +static int SHPTreeNodeTrim( SHPTreeNode * psTreeNode ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* Trim subtrees, and free subnodes that come back empty. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( SHPTreeNodeTrim( psTreeNode->apsSubNode[i] ) ) + { + SHPDestroyTreeNode( psTreeNode->apsSubNode[i] ); + + psTreeNode->apsSubNode[i] = + psTreeNode->apsSubNode[psTreeNode->nSubNodes-1]; + + psTreeNode->nSubNodes--; + + i--; /* process the new occupant of this subnode entry */ + } + } + +/* -------------------------------------------------------------------- */ +/* If the current node has 1 subnode and no shapes, promote that */ +/* subnode to the current node position. */ +/* -------------------------------------------------------------------- */ + if( psTreeNode->nSubNodes == 1 && psTreeNode->nShapeCount == 0) + { + SHPTreeNode* psSubNode = psTreeNode->apsSubNode[0]; + + memcpy(psTreeNode->adfBoundsMin, psSubNode->adfBoundsMin, + sizeof(psSubNode->adfBoundsMin)); + memcpy(psTreeNode->adfBoundsMax, psSubNode->adfBoundsMax, + sizeof(psSubNode->adfBoundsMax)); + psTreeNode->nShapeCount = psSubNode->nShapeCount; + assert(psTreeNode->panShapeIds == NULL); + psTreeNode->panShapeIds = psSubNode->panShapeIds; + assert(psTreeNode->papsShapeObj == NULL); + psTreeNode->papsShapeObj = psSubNode->papsShapeObj; + psTreeNode->nSubNodes = psSubNode->nSubNodes; + for( i = 0; i < psSubNode->nSubNodes; i++ ) + psTreeNode->apsSubNode[i] = psSubNode->apsSubNode[i]; + free(psSubNode); + } + +/* -------------------------------------------------------------------- */ +/* We should be trimmed if we have no subnodes, and no shapes. */ +/* -------------------------------------------------------------------- */ + return( psTreeNode->nSubNodes == 0 && psTreeNode->nShapeCount == 0 ); +} + +/************************************************************************/ +/* SHPTreeTrimExtraNodes() */ +/* */ +/* Trim empty nodes from the tree. Note that we never trim an */ +/* empty root node. */ +/************************************************************************/ + +void SHPAPI_CALL +SHPTreeTrimExtraNodes( SHPTree * hTree ) + +{ + SHPTreeNodeTrim( hTree->psRoot ); +} + +/************************************************************************/ +/* SwapWord() */ +/* */ +/* Swap a 2, 4 or 8 byte word. */ +/************************************************************************/ + +static void SwapWord( int length, void * wordP ) + +{ + int i; + unsigned char temp; + + for( i=0; i < length/2; i++ ) + { + temp = ((unsigned char *) wordP)[i]; + ((unsigned char *)wordP)[i] = ((unsigned char *) wordP)[length-i-1]; + ((unsigned char *) wordP)[length-i-1] = temp; + } +} + + +struct SHPDiskTreeInfo +{ + SAHooks sHooks; + SAFile fpQIX; +}; + +/************************************************************************/ +/* SHPOpenDiskTree() */ +/************************************************************************/ + +SHPTreeDiskHandle SHPOpenDiskTree( const char* pszQIXFilename, + SAHooks *psHooks ) +{ + SHPTreeDiskHandle hDiskTree; + + hDiskTree = (SHPTreeDiskHandle) calloc(sizeof(struct SHPDiskTreeInfo),1); + + if (psHooks == NULL) + SASetupDefaultHooks( &(hDiskTree->sHooks) ); + else + memcpy( &(hDiskTree->sHooks), psHooks, sizeof(SAHooks) ); + + hDiskTree->fpQIX = hDiskTree->sHooks.FOpen(pszQIXFilename, "rb"); + if (hDiskTree->fpQIX == NULL) + { + free(hDiskTree); + return NULL; + } + + return hDiskTree; +} + +/***********************************************************************/ +/* SHPCloseDiskTree() */ +/************************************************************************/ + +void SHPCloseDiskTree( SHPTreeDiskHandle hDiskTree ) +{ + if (hDiskTree == NULL) + return; + + hDiskTree->sHooks.FClose(hDiskTree->fpQIX); + free(hDiskTree); +} + +/************************************************************************/ +/* SHPSearchDiskTreeNode() */ +/************************************************************************/ + +static int +SHPSearchDiskTreeNode( SHPTreeDiskHandle hDiskTree, double *padfBoundsMin, double *padfBoundsMax, + int **ppanResultBuffer, int *pnBufferMax, + int *pnResultCount, int bNeedSwap, int nRecLevel ) + +{ + unsigned int i; + unsigned int offset; + unsigned int numshapes, numsubnodes; + double adfNodeBoundsMin[2], adfNodeBoundsMax[2]; + int nFReadAcc; + +/* -------------------------------------------------------------------- */ +/* Read and unswap first part of node info. */ +/* -------------------------------------------------------------------- */ + nFReadAcc = (int)hDiskTree->sHooks.FRead( &offset, 4, 1, hDiskTree->fpQIX ); + if ( bNeedSwap ) SwapWord ( 4, &offset ); + + nFReadAcc += (int)hDiskTree->sHooks.FRead( adfNodeBoundsMin, sizeof(double), 2, hDiskTree->fpQIX ); + nFReadAcc += (int)hDiskTree->sHooks.FRead( adfNodeBoundsMax, sizeof(double), 2, hDiskTree->fpQIX ); + if ( bNeedSwap ) + { + SwapWord( 8, adfNodeBoundsMin + 0 ); + SwapWord( 8, adfNodeBoundsMin + 1 ); + SwapWord( 8, adfNodeBoundsMax + 0 ); + SwapWord( 8, adfNodeBoundsMax + 1 ); + } + + nFReadAcc += (int)hDiskTree->sHooks.FRead( &numshapes, 4, 1, hDiskTree->fpQIX ); + if ( bNeedSwap ) SwapWord ( 4, &numshapes ); + + /* Check that we could read all previous values */ + if( nFReadAcc != 1 + 2 + 2 + 1 ) + { + hDiskTree->sHooks.Error("I/O error"); + return FALSE; + } + + /* Sanity checks to avoid int overflows in later computation */ + if( offset > INT_MAX - sizeof(int) ) + { + hDiskTree->sHooks.Error("Invalid value for offset"); + return FALSE; + } + + if( numshapes > (INT_MAX - offset - sizeof(int)) / sizeof(int) || + numshapes > INT_MAX / sizeof(int) - *pnResultCount ) + { + hDiskTree->sHooks.Error("Invalid value for numshapes"); + return FALSE; + } + +/* -------------------------------------------------------------------- */ +/* If we don't overlap this node at all, we can just fseek() */ +/* pass this node info and all subnodes. */ +/* -------------------------------------------------------------------- */ + if( !SHPCheckBoundsOverlap( adfNodeBoundsMin, adfNodeBoundsMax, + padfBoundsMin, padfBoundsMax, 2 ) ) + { + offset += numshapes*sizeof(int) + sizeof(int); + hDiskTree->sHooks.FSeek(hDiskTree->fpQIX, offset, SEEK_CUR); + return TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Add all the shapeids at this node to our list. */ +/* -------------------------------------------------------------------- */ + if(numshapes > 0) + { + if( *pnResultCount + numshapes > (unsigned int)*pnBufferMax ) + { + int* pNewBuffer; + + *pnBufferMax = (*pnResultCount + numshapes + 100) * 5 / 4; + + if( (size_t)*pnBufferMax > INT_MAX / sizeof(int) ) + *pnBufferMax = *pnResultCount + numshapes; + + pNewBuffer = (int *) + SfRealloc( *ppanResultBuffer, *pnBufferMax * sizeof(int) ); + + if( pNewBuffer == NULL ) + { + hDiskTree->sHooks.Error("Out of memory error"); + return FALSE; + } + + *ppanResultBuffer = pNewBuffer; + } + + if( hDiskTree->sHooks.FRead( *ppanResultBuffer + *pnResultCount, + sizeof(int), numshapes, hDiskTree->fpQIX ) != numshapes ) + { + hDiskTree->sHooks.Error("I/O error"); + return FALSE; + } + + if (bNeedSwap ) + { + for( i=0; isHooks.FRead( &numsubnodes, 4, 1, hDiskTree->fpQIX ) != 1 ) + { + hDiskTree->sHooks.Error("I/O error"); + return FALSE; + } + if ( bNeedSwap ) SwapWord ( 4, &numsubnodes ); + if( numsubnodes > 0 && nRecLevel == 32 ) + { + hDiskTree->sHooks.Error("Shape tree is too deep"); + return FALSE; + } + + for(i=0; isHooks.FSeek( hDiskTree->fpQIX, 0, SEEK_SET ); + hDiskTree->sHooks.FRead( abyBuf, 16, 1, hDiskTree->fpQIX ); + + if( memcmp( abyBuf, "SQT", 3 ) != 0 ) + return NULL; + + if( (abyBuf[3] == 2 && bBigEndian) + || (abyBuf[3] == 1 && !bBigEndian) ) + bNeedSwap = FALSE; + else + bNeedSwap = TRUE; + +/* -------------------------------------------------------------------- */ +/* Search through root node and it's descendants. */ +/* -------------------------------------------------------------------- */ + if( !SHPSearchDiskTreeNode( hDiskTree, padfBoundsMin, padfBoundsMax, + &panResultBuffer, &nBufferMax, + pnShapeCount, bNeedSwap, 0 ) ) + { + if( panResultBuffer != NULL ) + free( panResultBuffer ); + *pnShapeCount = 0; + return NULL; + } +/* -------------------------------------------------------------------- */ +/* Sort the id array */ +/* -------------------------------------------------------------------- */ + + /* To distinguish between empty intersection from error case */ + if( panResultBuffer == NULL ) + panResultBuffer = (int*) calloc(1, sizeof(int)); + else + qsort(panResultBuffer, *pnShapeCount, sizeof(int), compare_ints); + + + return panResultBuffer; +} + +/************************************************************************/ +/* SHPGetSubNodeOffset() */ +/* */ +/* Determine how big all the subnodes of this node (and their */ +/* children) will be. This will allow disk based searchers to */ +/* seek past them all efficiently. */ +/************************************************************************/ + +static int SHPGetSubNodeOffset( SHPTreeNode *node) +{ + int i; + int offset=0; + + for(i=0; inSubNodes; i++ ) + { + if(node->apsSubNode[i]) + { + offset += 4*sizeof(double) + + (node->apsSubNode[i]->nShapeCount+3)*sizeof(int); + offset += SHPGetSubNodeOffset(node->apsSubNode[i]); + } + } + + return(offset); +} + +/************************************************************************/ +/* SHPWriteTreeNode() */ +/************************************************************************/ + +static void SHPWriteTreeNode( SAFile fp, SHPTreeNode *node, SAHooks* psHooks) +{ + int i,j; + int offset; + unsigned char *pabyRec = NULL; + assert( NULL != node ); + + offset = SHPGetSubNodeOffset(node); + + pabyRec = (unsigned char *) + malloc(sizeof(double) * 4 + + (3 * sizeof(int)) + (node->nShapeCount * sizeof(int)) ); + if( NULL == pabyRec ) + { +#ifdef USE_CPL + CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); +#endif + assert( 0 ); + return; + } + + memcpy( pabyRec, &offset, 4); + + /* minx, miny, maxx, maxy */ + memcpy( pabyRec+ 4, node->adfBoundsMin+0, sizeof(double) ); + memcpy( pabyRec+12, node->adfBoundsMin+1, sizeof(double) ); + memcpy( pabyRec+20, node->adfBoundsMax+0, sizeof(double) ); + memcpy( pabyRec+28, node->adfBoundsMax+1, sizeof(double) ); + + memcpy( pabyRec+36, &node->nShapeCount, 4); + j = node->nShapeCount * sizeof(int); + if( j ) + memcpy( pabyRec+40, node->panShapeIds, j); + memcpy( pabyRec+j+40, &node->nSubNodes, 4); + + psHooks->FWrite( pabyRec, 44+j, 1, fp ); + free (pabyRec); + + for(i=0; inSubNodes; i++ ) + { + if(node->apsSubNode[i]) + SHPWriteTreeNode( fp, node->apsSubNode[i], psHooks); + } +} + +/************************************************************************/ +/* SHPWriteTree() */ +/************************************************************************/ + +int SHPAPI_CALL SHPWriteTree(SHPTree *tree, const char *filename ) +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return SHPWriteTreeLL(tree, filename, &sHooks); +} + +/************************************************************************/ +/* SHPWriteTreeLL() */ +/************************************************************************/ + +int SHPWriteTreeLL(SHPTree *tree, const char *filename, SAHooks* psHooks ) +{ + char signature[4] = "SQT"; + int i; + char abyBuf[32]; + SAFile fp; + + SAHooks sHooks; + if (psHooks == NULL) + { + SASetupDefaultHooks( &sHooks ); + psHooks = &sHooks; + } + +/* -------------------------------------------------------------------- */ +/* Open the output file. */ +/* -------------------------------------------------------------------- */ + fp = psHooks->FOpen(filename, "wb"); + if( fp == NULL ) + { + return FALSE; + } + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this machine. */ +/* -------------------------------------------------------------------- */ + i = 1; + if( *((unsigned char *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; + +/* -------------------------------------------------------------------- */ +/* Write the header. */ +/* -------------------------------------------------------------------- */ + memcpy( abyBuf+0, signature, 3 ); + + if( bBigEndian ) + abyBuf[3] = 2; /* New MSB */ + else + abyBuf[3] = 1; /* New LSB */ + + abyBuf[4] = 1; /* version */ + abyBuf[5] = 0; /* next 3 reserved */ + abyBuf[6] = 0; + abyBuf[7] = 0; + + psHooks->FWrite( abyBuf, 8, 1, fp ); + + psHooks->FWrite( &(tree->nTotalCount), 4, 1, fp ); + + /* write maxdepth */ + + psHooks->FWrite( &(tree->nMaxDepth), 4, 1, fp ); + +/* -------------------------------------------------------------------- */ +/* Write all the nodes "in order". */ +/* -------------------------------------------------------------------- */ + + SHPWriteTreeNode( fp, tree->psRoot, psHooks ); + + psHooks->FClose( fp ); + + return TRUE; +} diff --git a/support/ShapeLib/shptreedump.c b/support/ShapeLib/shptreedump.c new file mode 100644 index 00000000..bc725692 --- /dev/null +++ b/support/ShapeLib/shptreedump.c @@ -0,0 +1,466 @@ +/****************************************************************************** + * $Id: shptreedump.c,v 1.9 2016-12-05 12:44:06 erouault Exp $ + * + * Project: Shapelib + * Purpose: Mainline for creating and dumping an ASCII representation of + * a quadtree. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: shptreedump.c,v $ + * Revision 1.9 2016-12-05 12:44:06 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.8 2005-01-03 22:30:13 fwarmerdam + * added support for saved quadtrees + * + * Revision 1.7 2002/04/10 16:59:12 warmerda + * fixed email + * + * Revision 1.6 1999/11/05 14:12:05 warmerda + * updated license terms + * + * Revision 1.5 1999/06/02 18:24:21 warmerda + * added trimming code + * + * Revision 1.4 1999/06/02 17:56:12 warmerda + * added quad'' subnode support for trees + * + * Revision 1.3 1999/05/18 19:13:13 warmerda + * Use fabs() instead of abs(). + * + * Revision 1.2 1999/05/18 19:11:11 warmerda + * Added example searching capability + * + * Revision 1.1 1999/05/18 17:49:20 warmerda + * New + * + */ + +#include "shapefil.h" + +#include +#include +#include +#include + +SHP_CVSID("$Id: shptreedump.c,v 1.9 2016-12-05 12:44:06 erouault Exp $") + +static void SHPTreeNodeDump( SHPTree *, SHPTreeNode *, const char *, int ); +static void SHPTreeNodeSearchAndDump( SHPTree *, double *, double * ); + +/************************************************************************/ +/* Usage() */ +/************************************************************************/ + +static void Usage() + +{ + printf( "shptreedump [-maxdepth n] [-search xmin ymin xmax ymax]\n" + " [-v] [-o indexfilename] [-i indexfilename]\n" + " shp_file\n" ); + exit( 1 ); +} + + + +/************************************************************************/ +/* main() */ +/************************************************************************/ +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP; + SHPTree *psTree; + int nExpandShapes = 0; + int nMaxDepth = 0; + int bDoSearch = 0; + double adfSearchMin[4], adfSearchMax[4]; + const char *pszOutputIndexFilename = NULL; + const char *pszInputIndexFilename = NULL; + const char *pszTargetFile = NULL; + +/* -------------------------------------------------------------------- */ +/* Consume flags. */ +/* -------------------------------------------------------------------- */ + while( argc > 1 ) + { + if( strcmp(argv[1],"-v") == 0 ) + { + nExpandShapes = 1; + argv++; + argc--; + } + else if( strcmp(argv[1],"-maxdepth") == 0 && argc > 2 ) + { + nMaxDepth = atoi(argv[2]); + argv += 2; + argc -= 2; + } + else if( strcmp(argv[1],"-o") == 0 && argc > 2 ) + { + pszOutputIndexFilename = argv[2]; + argv += 2; + argc -= 2; + } + else if( strcmp(argv[1],"-i") == 0 && argc > 2 ) + { + pszInputIndexFilename = argv[2]; + argv += 2; + argc -= 2; + } + else if( strcmp(argv[1],"-search") == 0 && argc > 5 ) + { + bDoSearch = 1; + + adfSearchMin[0] = atof(argv[2]); + adfSearchMin[1] = atof(argv[3]); + adfSearchMax[0] = atof(argv[4]); + adfSearchMax[1] = atof(argv[5]); + + adfSearchMin[2] = adfSearchMax[2] = 0.0; + adfSearchMin[3] = adfSearchMax[3] = 0.0; + + if( adfSearchMin[0] > adfSearchMax[0] + || adfSearchMin[1] > adfSearchMax[1] ) + { + printf( "Min greater than max in search criteria.\n" ); + Usage(); + } + + argv += 5; + argc -= 5; + } + else if( pszTargetFile == NULL ) + { + pszTargetFile = argv[1]; + argv++; + argc--; + } + else + { + printf( "Unrecognised argument: %s\n", argv[1] ); + Usage(); + } + } + +/* -------------------------------------------------------------------- */ +/* Do a search with an existing index file? */ +/* -------------------------------------------------------------------- */ + if( bDoSearch && pszInputIndexFilename != NULL ) + { + FILE *fp = fopen( pszInputIndexFilename, "rb" ); + int *panResult, nResultCount = 0, iResult; + + if( fp == NULL ) + { + perror( pszInputIndexFilename ); + exit( 1 ); + } + + panResult = SHPSearchDiskTree( fp, adfSearchMin, adfSearchMax, + &nResultCount ); + + printf( "Result: " ); + for( iResult = 0; iResult < nResultCount; iResult++ ) + printf( "%d ", panResult[iResult] ); + printf( "\n" ); + free( panResult ); + + fclose( fp ); + + exit( 0 ); + } + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( pszTargetFile == NULL ) + { + Usage(); + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( pszTargetFile, "rb" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", pszTargetFile ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Build a quadtree structure for this file. */ +/* -------------------------------------------------------------------- */ + psTree = SHPCreateTree( hSHP, 2, nMaxDepth, NULL, NULL ); + +/* -------------------------------------------------------------------- */ +/* Trim unused nodes from the tree. */ +/* -------------------------------------------------------------------- */ + SHPTreeTrimExtraNodes( psTree ); + +/* -------------------------------------------------------------------- */ +/* Dump tree to .qix file. */ +/* -------------------------------------------------------------------- */ + if( pszOutputIndexFilename != NULL ) + { + SHPWriteTree( psTree, pszOutputIndexFilename ); + } + +/* -------------------------------------------------------------------- */ +/* Dump tree by recursive descent. */ +/* -------------------------------------------------------------------- */ + else if( !bDoSearch ) + SHPTreeNodeDump( psTree, psTree->psRoot, "", nExpandShapes ); + +/* -------------------------------------------------------------------- */ +/* or do a search instead. */ +/* -------------------------------------------------------------------- */ + else + SHPTreeNodeSearchAndDump( psTree, adfSearchMin, adfSearchMax ); + +/* -------------------------------------------------------------------- */ +/* cleanup */ +/* -------------------------------------------------------------------- */ + SHPDestroyTree( psTree ); + + SHPClose( hSHP ); + +#ifdef USE_DBMALLOC + malloc_dump(2); +#endif + + exit( 0 ); +} + +/************************************************************************/ +/* EmitCoordinate() */ +/************************************************************************/ + +static void EmitCoordinate( double * padfCoord, int nDimension ) + +{ + const char *pszFormat; + + if( fabs(padfCoord[0]) < 180 && fabs(padfCoord[1]) < 180 ) + pszFormat = "%.9f"; + else + pszFormat = "%.2f"; + + printf( pszFormat, padfCoord[0] ); + printf( "," ); + printf( pszFormat, padfCoord[1] ); + + if( nDimension > 2 ) + { + printf( "," ); + printf( pszFormat, padfCoord[2] ); + } + if( nDimension > 3 ) + { + printf( "," ); + printf( pszFormat, padfCoord[3] ); + } +} + +/************************************************************************/ +/* EmitShape() */ +/************************************************************************/ + +static void EmitShape( SHPObject * psObject, const char * pszPrefix, + int nDimension ) + +{ + int i; + + printf( "%s( Shape\n", pszPrefix ); + printf( "%s ShapeId = %d\n", pszPrefix, psObject->nShapeId ); + + printf( "%s Min = (", pszPrefix ); + EmitCoordinate( &(psObject->dfXMin), nDimension ); + printf( ")\n" ); + + printf( "%s Max = (", pszPrefix ); + EmitCoordinate( &(psObject->dfXMax), nDimension ); + printf( ")\n" ); + + for( i = 0; i < psObject->nVertices; i++ ) + { + double adfVertex[4]; + + printf( "%s Vertex[%d] = (", pszPrefix, i ); + + adfVertex[0] = psObject->padfX[i]; + adfVertex[1] = psObject->padfY[i]; + adfVertex[2] = psObject->padfZ[i]; + adfVertex[3] = psObject->padfM[i]; + + EmitCoordinate( adfVertex, nDimension ); + printf( ")\n" ); + } + printf( "%s)\n", pszPrefix ); +} + +/************************************************************************/ +/* SHPTreeNodeDump() */ +/* */ +/* Dump a tree node in a readable form. */ +/************************************************************************/ + +static void SHPTreeNodeDump( SHPTree * psTree, + SHPTreeNode * psTreeNode, + const char * pszPrefix, + int nExpandShapes ) + +{ + char szNextPrefix[150]; + int i; + + strcpy( szNextPrefix, pszPrefix ); + if( strlen(pszPrefix) < sizeof(szNextPrefix) - 3 ) + strcat( szNextPrefix, " " ); + + printf( "%s( SHPTreeNode\n", pszPrefix ); + +/* -------------------------------------------------------------------- */ +/* Emit the bounds. */ +/* -------------------------------------------------------------------- */ + printf( "%s Min = (", pszPrefix ); + EmitCoordinate( psTreeNode->adfBoundsMin, psTree->nDimension ); + printf( ")\n" ); + + printf( "%s Max = (", pszPrefix ); + EmitCoordinate( psTreeNode->adfBoundsMax, psTree->nDimension ); + printf( ")\n" ); + +/* -------------------------------------------------------------------- */ +/* Emit the list of shapes on this node. */ +/* -------------------------------------------------------------------- */ + if( nExpandShapes ) + { + printf( "%s Shapes(%d):\n", pszPrefix, psTreeNode->nShapeCount ); + for( i = 0; i < psTreeNode->nShapeCount; i++ ) + { + SHPObject *psObject; + + psObject = SHPReadObject( psTree->hSHP, + psTreeNode->panShapeIds[i] ); + assert( psObject != NULL ); + if( psObject != NULL ) + { + EmitShape( psObject, szNextPrefix, psTree->nDimension ); + } + + SHPDestroyObject( psObject ); + } + } + else + { + printf( "%s Shapes(%d): ", pszPrefix, psTreeNode->nShapeCount ); + for( i = 0; i < psTreeNode->nShapeCount; i++ ) + { + printf( "%d ", psTreeNode->panShapeIds[i] ); + } + printf( "\n" ); + } + +/* -------------------------------------------------------------------- */ +/* Emit subnodes. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( psTreeNode->apsSubNode[i] != NULL ) + SHPTreeNodeDump( psTree, psTreeNode->apsSubNode[i], + szNextPrefix, nExpandShapes ); + } + + printf( "%s)\n", pszPrefix ); + + return; +} + +/************************************************************************/ +/* SHPTreeNodeSearchAndDump() */ +/************************************************************************/ + +static void SHPTreeNodeSearchAndDump( SHPTree * hTree, + double *padfBoundsMin, + double *padfBoundsMax ) + +{ + int *panHits, nShapeCount, i; + +/* -------------------------------------------------------------------- */ +/* Perform the search for likely candidates. These are shapes */ +/* that fall into a tree node whose bounding box intersects our */ +/* area of interest. */ +/* -------------------------------------------------------------------- */ + panHits = SHPTreeFindLikelyShapes( hTree, padfBoundsMin, padfBoundsMax, + &nShapeCount ); + +/* -------------------------------------------------------------------- */ +/* Read all of these shapes, and establish whether the shape's */ +/* bounding box actually intersects the area of interest. Note */ +/* that the bounding box could intersect the area of interest, */ +/* and the shape itself still not cross it but we don't try to */ +/* address that here. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < nShapeCount; i++ ) + { + SHPObject *psObject; + + psObject = SHPReadObject( hTree->hSHP, panHits[i] ); + if( psObject == NULL ) + continue; + + if( !SHPCheckBoundsOverlap( padfBoundsMin, padfBoundsMax, + &(psObject->dfXMin), + &(psObject->dfXMax), + hTree->nDimension ) ) + { + printf( "Shape %d: not in area of interest, but fetched.\n", + panHits[i] ); + } + else + { + printf( "Shape %d: appears to be in area of interest.\n", + panHits[i] ); + } + + SHPDestroyObject( psObject ); + } + + if( nShapeCount == 0 ) + printf( "No shapes found in search.\n" ); +} diff --git a/support/ShapeLib/shputils.c b/support/ShapeLib/shputils.c new file mode 100644 index 00000000..248a2f1e --- /dev/null +++ b/support/ShapeLib/shputils.c @@ -0,0 +1,1077 @@ +/****************************************************************************** + * $Id: shputils.c,v 1.11 2016-12-05 12:44:06 erouault Exp $ + * + * Project: Shapelib + * Purpose: + * Altered "shpdump" and "dbfdump" to allow two files to be appended. + * Other Functions: + * Selecting from the DBF before the write occurs. + * Change the UNITS between Feet and Meters and Shift X,Y. + * Clip and Erase boundary. The program only passes thru the + * data once. + * + * Bill Miller North Carolina - Department of Transporation + * Feb. 1997 -- bmiller@dot.state.nc.us + * There was not a lot of time to debug hidden problems; + * And the code is not very well organized or documented. + * The clip/erase function was not well tested. + * Oct. 2000 -- bmiller@dot.state.nc.us + * Fixed the problem when select is using numbers + * larger than short integer. It now reads long integer. + * NOTE: DBF files created using windows NT will read as a string with + * a length of 381 characters. This is a bug in "dbfopen". + * + * + * Author: Bill Miller (bmiller@dot.state.nc.us) + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + * + * $Log: shputils.c,v $ + * Revision 1.11 2016-12-05 12:44:06 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.10 2007-12-13 19:59:23 fwarmerdam + * reindent code, avoid some warnings. + * + * Revision 1.9 2004/01/14 14:56:00 fwarmerdam + * Some cleanlyness improvements. + * + * Revision 1.8 2004/01/14 14:40:22 fwarmerdam + * Fixed exit() call to include code. + * + * Revision 1.7 2003/02/25 17:20:22 warmerda + * Set psCShape to NULL after SHPDestroyObject() to avoid multi-frees of + * the same memory ... as submitted by Fred Fox. + * + * Revision 1.6 2001/08/28 13:57:14 warmerda + * fixed DBFAddField return value check + * + * Revision 1.5 2000/11/02 13:52:48 warmerda + * major upgrade from Bill Miller + * + * Revision 1.4 1999/11/05 14:12:05 warmerda + * updated license terms + * + * Revision 1.3 1998/12/03 15:47:39 warmerda + * Did a bunch of rewriting to make it work with the V1.2 API. + * + * Revision 1.2 1998/06/18 01:19:49 warmerda + * Made C++ compilable. + * + * Revision 1.1 1997/05/27 20:40:27 warmerda + * Initial revision + */ + +#include "shapefil.h" +#include "string.h" +#include + +SHP_CVSID("$Id: shputils.c,v 1.11 2016-12-05 12:44:06 erouault Exp $") + +#ifndef FALSE +# define FALSE 0 +# define TRUE 1 +#endif + +char infile[80], outfile[80], temp[400]; + +/* Variables for shape files */ +SHPHandle hSHP; +SHPHandle hSHPappend; +int nShapeType, nEntities, iPart; +int nShapeTypeAppend, nEntitiesAppend; +SHPObject *psCShape; +double adfBoundsMin[4], adfBoundsMax[4]; + + +/* Variables for DBF files */ +DBFHandle hDBF; +DBFHandle hDBFappend; + +DBFFieldType iType; +DBFFieldType jType; + +char iszTitle[12]; +char jszTitle[12]; + +int *pt; +char iszFormat[32], iszField[1024]; +char jszFormat[32], jszField[1024]; +int i, ti, iWidth, iDecimals, iRecord; +int j, tj, jWidth, jDecimals, jRecord; + + +int clip_boundary(); +double findunit(char *unit); +void openfiles(void); +void setext(char *pt, char *ext); +int strncasecmp2(char *s1, char *s2, int n); +void mergefields(void); +void findselect(void); +void showitems(void); +int selectrec(); +void check_theme_bnd(); +int clip_boundary(); +void error(); + + +/* -------------------------------------------------------------------- */ +/* Variables for the DESCRIBE function */ +/* -------------------------------------------------------------------- */ + int ilist = FALSE, iall = FALSE; +/* -------------------------------------------------------------------- */ +/* Variables for the SELECT function */ +/* -------------------------------------------------------------------- */ + int found = FALSE, newdbf = FALSE; + char selectitem[40], *cpt; + long int selectvalues[150], selcount=0; + int iselect = FALSE, iselectitem = -1; + int iunselect = FALSE; + +/* -------------------------------------------------------------------- */ +/* Variables for the CLIP and ERASE functions */ +/* -------------------------------------------------------------------- */ + double cxmin, cymin, cxmax, cymax; + int iclip = FALSE, ierase = FALSE; + int itouch = FALSE, iinside = FALSE, icut = FALSE; + int ibound = FALSE, ipoly = FALSE; + char clipfile[80]; + +/* -------------------------------------------------------------------- */ +/* Variables for the FACTOR function */ +/* -------------------------------------------------------------------- */ + double infactor,outfactor,factor = 0; /* NO FACTOR */ + int iunit = FALSE; + int ifactor = FALSE; + + +/* -------------------------------------------------------------------- */ +/* Variables for the SHIFT function */ +/* -------------------------------------------------------------------- */ + double xshift = 0, yshift = 0; /* NO SHIFT */ + +int main( int argc, char ** argv ) +{ + +/* -------------------------------------------------------------------- */ +/* Check command line usage. */ +/* -------------------------------------------------------------------- */ + if( argc < 2 ) error(); + strcpy(infile, argv[1]); + if (argc > 2) { + strcpy(outfile,argv[2]); + if (strncasecmp2(outfile, "LIST",0) == 0) { ilist = TRUE; } + if (strncasecmp2(outfile, "ALL",0) == 0) { iall = TRUE; } + } + if (ilist || iall || argc == 2 ) { + setext(infile, "shp"); + printf("DESCRIBE: %s\n",infile); + strcpy(outfile,""); + } +/* -------------------------------------------------------------------- */ +/* Look for other functions on the command line. (SELECT, UNIT) */ +/* -------------------------------------------------------------------- */ + for (i = 3; i < argc; i++) + { + if ((strncasecmp2(argv[i], "SEL",3) == 0) || + (strncasecmp2(argv[i], "UNSEL",5) == 0)) + { + if (strncasecmp2(argv[i], "UNSEL",5) == 0) iunselect=TRUE; + i++; + if (i >= argc) error(); + strcpy(selectitem,argv[i]); + i++; + if (i >= argc) error(); + selcount=0; + strcpy(temp,argv[i]); + cpt=temp; + tj = atoi(cpt); + ti = 0; + while (tj>0) { + selectvalues[selcount] = tj; + while( *cpt >= '0' && *cpt <= '9') + cpt++; + while( *cpt > '\0' && (*cpt < '0' || *cpt > '9') ) + cpt++; + tj=atoi(cpt); + selcount++; + } + iselect=TRUE; + } /*** End SEL & UNSEL ***/ + else + if ((strncasecmp2(argv[i], "CLIP",4) == 0) || + (strncasecmp2(argv[i], "ERASE",5) == 0)) + { + if (strncasecmp2(argv[i], "ERASE",5) == 0) ierase=TRUE; + i++; + if (i >= argc) error(); + strcpy(clipfile,argv[i]); + sscanf(argv[i],"%lf",&cxmin); + i++; + if (i >= argc) error(); + if (strncasecmp2(argv[i], "BOUND",5) == 0) { + setext(clipfile, "shp"); + hSHP = SHPOpen( clipfile, "rb" ); + if( hSHP == NULL ) + { + printf( "ERROR: Unable to open the clip shape file:%s\n", clipfile ); + exit( 1 ); + } + SHPGetInfo( hSHPappend, NULL, NULL, + adfBoundsMin, adfBoundsMax ); + cxmin = adfBoundsMin[0]; + cymin = adfBoundsMin[1]; + cxmax = adfBoundsMax[0]; + cymax = adfBoundsMax[1]; + printf("Theme Clip Boundary: (%lf,%lf) - (%lf,%lf)\n", + cxmin, cymin, cxmax, cymax); + ibound=TRUE; + } else { /*** xmin,ymin,xmax,ymax ***/ + sscanf(argv[i],"%lf",&cymin); + i++; + if (i >= argc) error(); + sscanf(argv[i],"%lf",&cxmax); + i++; + if (i >= argc) error(); + sscanf(argv[i],"%lf",&cymax); + printf("Clip Box: (%lf,%lf) - (%lf,%lf)\n",cxmin, cymin, cxmax, cymax); + } + i++; + if (i >= argc) error(); + if (strncasecmp2(argv[i], "CUT",3) == 0) icut=TRUE; + else if (strncasecmp2(argv[i], "TOUCH",5) == 0) itouch=TRUE; + else if (strncasecmp2(argv[i], "INSIDE",6) == 0) iinside=TRUE; + else error(); + iclip=TRUE; + } /*** End CLIP & ERASE ***/ + else if (strncasecmp2(argv[i], "FACTOR",0) == 0) + { + i++; + if (i >= argc) error(); + infactor=findunit(argv[i]); + if (infactor == 0) error(); + iunit=TRUE; + i++; + if (i >= argc) error(); + outfactor=findunit(argv[i]); + if (outfactor == 0) + { + sscanf(argv[i],"%lf",&factor); + if (factor == 0) error(); + } + if (factor == 0) + { + if (infactor ==0) + { puts("ERROR: Input unit must be defined before output unit"); exit(1); } + factor=infactor/outfactor; + } + printf("Output file coordinate values will be factored by %lg\n",factor); + ifactor=(factor != 1); /* True if a valid factor */ + } /*** End FACTOR ***/ + else if (strncasecmp2(argv[i],"SHIFT",5) == 0) + { + i++; + if (i >= argc) error(); + sscanf(argv[i],"%lf",&xshift); + i++; + if (i >= argc) error(); + sscanf(argv[i],"%lf",&yshift); + iunit=TRUE; + printf("X Shift: %lg Y Shift: %lg\n",xshift,yshift); + } /*** End SHIFT ***/ + else { + printf("ERROR: Unknown function %s\n",argv[i]); error(); + } + } +/* -------------------------------------------------------------------- */ +/* If there is no data in this file let the user know. */ +/* -------------------------------------------------------------------- */ + openfiles(); /* Open the infile and the outfile for shape and dbf. */ + if( DBFGetFieldCount(hDBF) == 0 ) + { + puts( "There are no fields in this table!" ); + exit( 1 ); + } +/* -------------------------------------------------------------------- */ +/* Print out the file bounds. */ +/* -------------------------------------------------------------------- */ + iRecord = DBFGetRecordCount( hDBF ); + SHPGetInfo( hSHP, NULL, NULL, adfBoundsMin, adfBoundsMax ); + + printf( "Input Bounds: (%lg,%lg) - (%lg,%lg) Entities: %d DBF: %d\n", + adfBoundsMin[0], adfBoundsMin[1], + adfBoundsMax[0], adfBoundsMax[1], + nEntities, iRecord ); + + if (strcmp(outfile,"") == 0) /* Describe the shapefile; No other functions */ + { + ti = DBFGetFieldCount( hDBF ); + showitems(); + exit(0); + } + + if (iclip) check_theme_bnd(); + + jRecord = DBFGetRecordCount( hDBFappend ); + SHPGetInfo( hSHPappend, NULL, NULL, adfBoundsMin, adfBoundsMax ); + if (nEntitiesAppend == 0) + puts("New Output File\n"); + else + printf( "Append Bounds: (%lg,%lg)-(%lg,%lg) Entities: %d DBF: %d\n", + adfBoundsMin[0], adfBoundsMin[1], + adfBoundsMax[0], adfBoundsMax[1], + nEntitiesAppend, jRecord ); + +/* -------------------------------------------------------------------- */ +/* Find matching fields in the append file or add new items. */ +/* -------------------------------------------------------------------- */ + mergefields(); +/* -------------------------------------------------------------------- */ +/* Find selection field if needed. */ +/* -------------------------------------------------------------------- */ + if (iselect) findselect(); + +/* -------------------------------------------------------------------- */ +/* Read all the records */ +/* -------------------------------------------------------------------- */ + jRecord = DBFGetRecordCount( hDBFappend ); + for( iRecord = 0; iRecord < nEntities; iRecord++) /** DBFGetRecordCount(hDBF) **/ + { +/* -------------------------------------------------------------------- */ +/* SELECT for values if needed. (Can the record be skipped.) */ +/* -------------------------------------------------------------------- */ + if (iselect) + if (selectrec() == 0) goto SKIP_RECORD; /** SKIP RECORD **/ + +/* -------------------------------------------------------------------- */ +/* Read a Shape record */ +/* -------------------------------------------------------------------- */ + psCShape = SHPReadObject( hSHP, iRecord ); + +/* -------------------------------------------------------------------- */ +/* Clip coordinates of shapes if needed. */ +/* -------------------------------------------------------------------- */ + if (iclip) + if (clip_boundary() == 0) goto SKIP_RECORD; /** SKIP RECORD **/ + +/* -------------------------------------------------------------------- */ +/* Read a DBF record and copy each field. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < DBFGetFieldCount(hDBF); i++ ) + { +/* -------------------------------------------------------------------- */ +/* Store the record according to the type and formatting */ +/* information implicit in the DBF field description. */ +/* -------------------------------------------------------------------- */ + if (pt[i] > -1) /* if the current field exists in output file */ + { + switch( DBFGetFieldInfo( hDBF, i, NULL, &iWidth, &iDecimals ) ) + { + case FTString: + case FTLogical: + DBFWriteStringAttribute(hDBFappend, jRecord, pt[i], + (DBFReadStringAttribute( hDBF, iRecord, i )) ); + break; + + case FTInteger: + DBFWriteIntegerAttribute(hDBFappend, jRecord, pt[i], + (DBFReadIntegerAttribute( hDBF, iRecord, i )) ); + break; + + case FTDouble: + DBFWriteDoubleAttribute(hDBFappend, jRecord, pt[i], + (DBFReadDoubleAttribute( hDBF, iRecord, i )) ); + break; + + case FTInvalid: + break; + } + } + } + jRecord++; +/* -------------------------------------------------------------------- */ +/* Change FACTOR and SHIFT coordinates of shapes if needed. */ +/* -------------------------------------------------------------------- */ + if (iunit) + { + for( j = 0; j < psCShape->nVertices; j++ ) + { + psCShape->padfX[j] = psCShape->padfX[j] * factor + xshift; + psCShape->padfY[j] = psCShape->padfY[j] * factor + yshift; + } + } + +/* -------------------------------------------------------------------- */ +/* Write the Shape record after recomputing current extents. */ +/* -------------------------------------------------------------------- */ + SHPComputeExtents( psCShape ); + SHPWriteObject( hSHPappend, -1, psCShape ); + + SKIP_RECORD: + SHPDestroyObject( psCShape ); + psCShape = NULL; + j=0; + } + +/* -------------------------------------------------------------------- */ +/* Print out the # of Entities and the file bounds. */ +/* -------------------------------------------------------------------- */ + jRecord = DBFGetRecordCount( hDBFappend ); + SHPGetInfo( hSHPappend, &nEntitiesAppend, &nShapeTypeAppend, + adfBoundsMin, adfBoundsMax ); + + printf( "Output Bounds: (%lg,%lg) - (%lg,%lg) Entities: %d DBF: %d\n\n", + adfBoundsMin[0], adfBoundsMin[1], + adfBoundsMax[0], adfBoundsMax[1], + nEntitiesAppend, jRecord ); + +/* -------------------------------------------------------------------- */ +/* Close the both shapefiles. */ +/* -------------------------------------------------------------------- */ + SHPClose( hSHP ); + SHPClose( hSHPappend ); + DBFClose( hDBF ); + DBFClose( hDBFappend ); + if (nEntitiesAppend == 0) { + puts("Remove the output files."); + setext(outfile, "dbf"); + remove(outfile); + setext(outfile, "shp"); + remove(outfile); + setext(outfile, "shx"); + remove(outfile); + } + return( 0 ); +} + + +/************************************************************************/ +/* openfiles() */ +/************************************************************************/ + +void openfiles() { +/* -------------------------------------------------------------------- */ +/* Open the DBF file. */ +/* -------------------------------------------------------------------- */ + setext(infile, "dbf"); + hDBF = DBFOpen( infile, "rb" ); + if( hDBF == NULL ) + { + printf( "ERROR: Unable to open the input DBF:%s\n", infile ); + exit( 1 ); + } +/* -------------------------------------------------------------------- */ +/* Open the append DBF file. */ +/* -------------------------------------------------------------------- */ + if (strcmp(outfile,"")) { + setext(outfile, "dbf"); + hDBFappend = DBFOpen( outfile, "rb+" ); + newdbf=0; + if( hDBFappend == NULL ) + { + newdbf=1; + hDBFappend = DBFCreate( outfile ); + if( hDBFappend == NULL ) + { + printf( "ERROR: Unable to open the append DBF:%s\n", outfile ); + exit( 1 ); + } + } + } +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + setext(infile, "shp"); + hSHP = SHPOpen( infile, "rb" ); + + if( hSHP == NULL ) + { + printf( "ERROR: Unable to open the input shape file:%s\n", infile ); + exit( 1 ); + } + + SHPGetInfo( hSHP, &nEntities, &nShapeType, NULL, NULL ); + +/* -------------------------------------------------------------------- */ +/* Open the passed append shapefile. */ +/* -------------------------------------------------------------------- */ + if (strcmp(outfile,"")) { + setext(outfile, "shp"); + hSHPappend = SHPOpen( outfile, "rb+" ); + + if( hSHPappend == NULL ) + { + hSHPappend = SHPCreate( outfile, nShapeType ); + if( hSHPappend == NULL ) + { + printf( "ERROR: Unable to open the append shape file:%s\n", + outfile ); + exit( 1 ); + } + } + SHPGetInfo( hSHPappend, &nEntitiesAppend, &nShapeTypeAppend, + NULL, NULL ); + + if (nShapeType != nShapeTypeAppend) + { + puts( "ERROR: Input and Append shape files are of different types."); + exit( 1 ); + } + } +} + +/* -------------------------------------------------------------------- */ +/* Change the extension. If there is any extension on the */ +/* filename, strip it off and add the new extension */ +/* -------------------------------------------------------------------- */ +void setext(char *pt, char *ext) +{ +int i; + for( i = strlen(pt)-1; + i > 0 && pt[i] != '.' && pt[i] != '/' && pt[i] != '\\'; + i-- ) {} + + if( pt[i] == '.' ) + pt[i] = '\0'; + + strcat(pt,"."); + strcat(pt,ext); +} + + + +/* -------------------------------------------------------------------- */ +/* Find matching fields in the append file. */ +/* Output file must have zero records to add any new fields. */ +/* -------------------------------------------------------------------- */ +void mergefields() +{ + int i,j; + ti = DBFGetFieldCount( hDBF ); + tj = DBFGetFieldCount( hDBFappend ); + /* Create a pointer array for the max # of fields in the output file */ + pt = (int *) malloc( (ti+tj+1) * sizeof(int) ); + + for( i = 0; i < ti; i++ ) + { + pt[i]= -1; /* Initial pt values to -1 */ + } + /* DBF must be empty before adding items */ + jRecord = DBFGetRecordCount( hDBFappend ); + for( i = 0; i < ti; i++ ) + { + iType = DBFGetFieldInfo( hDBF, i, iszTitle, &iWidth, &iDecimals ); + found=FALSE; + { + for( j = 0; j < tj; j++ ) /* Search all field names for a match */ + { + jType = DBFGetFieldInfo( hDBFappend, j, jszTitle, &jWidth, &jDecimals ); + if (iType == jType && (strcmp(iszTitle, jszTitle) == 0) ) + { + if (found || newdbf) + { + if (i == j) pt[i]=j; + printf("Warning: Duplicate field name found (%s)\n",iszTitle); + /* Duplicate field name + (Try to guess the correct field by position) */ + } + else + { + pt[i]=j; found=TRUE; + } + } + } + } + + if (pt[i] == -1 && (! found) ) /* Try to force into an existing field */ + { /* Ignore the field name, width, and decimal places */ + jType = DBFGetFieldInfo( hDBFappend, j, jszTitle, &jWidth, &jDecimals ); + if (iType == jType) + { + pt[i]=i; found=1; + } + } + if ( (! found) && jRecord == 0) /* Add missing field to the append table */ + { /* The output DBF must be is empty */ + pt[i]=tj; + tj++; + if( DBFAddField( hDBFappend, iszTitle, iType, iWidth, iDecimals ) + == -1 ) + { + printf( "Warning: DBFAddField(%s, TYPE:%d, WIDTH:%d DEC:%d, ITEM#:%d of %d) failed.\n", + iszTitle, iType, iWidth, iDecimals, (i+1), (ti+1) ); + pt[i]=-1; + } + } + } +} + + +void findselect() +{ + /* Find the select field name */ + iselectitem = -1; + for( i = 0; i < ti && iselectitem < 0; i++ ) + { + iType = DBFGetFieldInfo( hDBF, i, iszTitle, &iWidth, &iDecimals ); + if (strncasecmp2(iszTitle, selectitem, 0) == 0) iselectitem = i; + } + if (iselectitem == -1) + { + printf("Warning: Item not found for selection (%s)\n",selectitem); + iselect = FALSE; + iall = FALSE; + showitems(); + printf("Continued... (Selecting entire file)\n"); + } + /* Extract all of the select values (by field type) */ + +} + +void showitems() +{ + char stmp[40],slow[40],shigh[40]; + double dtmp,dlow,dhigh,dsum,mean; + long int itmp,ilow,ihigh,isum; + long int maxrec; + char *pt; + + printf("Available Items: (%d)",ti); + maxrec = DBFGetRecordCount(hDBF); + if (maxrec > 5000 && ! iall) + { maxrec=5000; printf(" ** ESTIMATED RANGES (MEAN) For more records use \"All\""); } + else { printf(" RANGES (MEAN)"); } + + for( i = 0; i < ti; i++ ) + { + switch( DBFGetFieldInfo( hDBF, i, iszTitle, &iWidth, &iDecimals ) ) + { + case FTString: + case FTLogical: + strcpy(slow, "~"); + strcpy(shigh,"\0"); + printf("\n String %3d %-16s",iWidth,iszTitle); + for( iRecord = 0; iRecord < maxrec; iRecord++ ) { + strncpy(stmp,DBFReadStringAttribute( hDBF, iRecord, i ),39); + if (strcmp(stmp,"!!") > 0) { + if (strncasecmp2(stmp,slow,0) < 0) strncpy(slow, stmp,39); + if (strncasecmp2(stmp,shigh,0) > 0) strncpy(shigh,stmp,39); + } + } + pt=slow+strlen(slow)-1; + while(*pt == ' ') { *pt='\0'; pt--; } + pt=shigh+strlen(shigh)-1; + while(*pt == ' ') { *pt='\0'; pt--; } + if (strncasecmp2(slow,shigh,0) < 0) printf("%s to %s",slow,shigh); + else if (strncasecmp2(slow,shigh,0) == 0) printf("= %s",slow); + else printf("No Values"); + break; + case FTInteger: + printf("\n Integer %3d %-16s",iWidth,iszTitle); + ilow = 1999999999; + ihigh= -1999999999; + isum = 0; + for( iRecord = 0; iRecord < maxrec; iRecord++ ) { + itmp = DBFReadIntegerAttribute( hDBF, iRecord, i ); + if (ilow > itmp) ilow = itmp; + if (ihigh < itmp) ihigh = itmp; + isum = isum + itmp; + } + mean=isum/maxrec; + if (ilow < ihigh) printf("%ld to %ld \t(%.1f)",ilow,ihigh,mean); + else if (ilow == ihigh) printf("= %ld",ilow); + else printf("No Values"); + break; + + case FTDouble: + printf("\n Real %3d,%d %-16s",iWidth,iDecimals,iszTitle); + dlow = 999999999999999.0; + dhigh= -999999999999999.0; + dsum = 0; + for( iRecord = 0; iRecord < maxrec; iRecord++ ) { + dtmp = DBFReadDoubleAttribute( hDBF, iRecord, i ); + if (dlow > dtmp) dlow = dtmp; + if (dhigh < dtmp) dhigh = dtmp; + dsum = dsum + dtmp; + } + mean=dsum/maxrec; + sprintf(stmp,"%%.%df to %%.%df \t(%%.%df)",iDecimals,iDecimals,iDecimals); + if (dlow < dhigh) printf(stmp,dlow,dhigh,mean); + else if (dlow == dhigh) { + sprintf(stmp,"= %%.%df",iDecimals); + printf(stmp,dlow); + } + else printf("No Values"); + break; + + case FTInvalid: + break; + + } + + } + printf("\n"); +} + +int selectrec() +{ + long int value, ty; + + ty = DBFGetFieldInfo( hDBF, iselectitem, NULL, &iWidth, &iDecimals); + switch(ty) + { + case FTString: + puts("Invalid Item"); + iselect=FALSE; + break; + case FTInteger: + value = DBFReadIntegerAttribute( hDBF, iRecord, iselectitem ); + for (j = 0; j= cxmin) && (adfBoundsMax[0] <= cxmax) && + (adfBoundsMin[1] >= cymin) && (adfBoundsMax[1] <= cymax) ) + { /** Theme is totally inside clip area **/ + if (ierase) nEntities=0; /** SKIP THEME **/ + else iclip=FALSE; /** WRITE THEME (Clip not needed) **/ + } + + if ( ( (adfBoundsMin[0] < cxmin) && (adfBoundsMax[0] < cxmin) ) || + ( (adfBoundsMin[1] < cymin) && (adfBoundsMax[1] < cymin) ) || + ( (adfBoundsMin[0] > cxmax) && (adfBoundsMax[0] > cxmax) ) || + ( (adfBoundsMin[1] > cymax) && (adfBoundsMax[1] > cymax) ) ) + { /** Theme is totally outside clip area **/ + if (ierase) iclip=FALSE; /** WRITE THEME (Clip not needed) **/ + else nEntities=0; /** SKIP THEME **/ + } + + if (nEntities == 0) + puts("WARNING: Theme is outside the clip area."); /** SKIP THEME **/ +} + +int clip_boundary() +{ + int inside; + int prev_outside; + int i2; + int j2; + + /*** FIRST check the boundary of the feature ***/ + if ( ( (psCShape->dfXMin < cxmin) && (psCShape->dfXMax < cxmin) ) || + ( (psCShape->dfYMin < cymin) && (psCShape->dfYMax < cymin) ) || + ( (psCShape->dfXMin > cxmax) && (psCShape->dfXMax > cxmax) ) || + ( (psCShape->dfYMin > cymax) && (psCShape->dfYMax > cymax) ) ) + { /** Feature is totally outside clip area **/ + if (ierase) return(1); /** WRITE RECORD **/ + else return(0); /** SKIP RECORD **/ + } + + if ( (psCShape->dfXMin >= cxmin) && (psCShape->dfXMax <= cxmax) && + (psCShape->dfYMin >= cymin) && (psCShape->dfYMax <= cymax) ) + { /** Feature is totally inside clip area **/ + if (ierase) return(0); /** SKIP RECORD **/ + else return(1); /** WRITE RECORD **/ + } + + if (iinside) + { /** INSIDE * Feature might touch the boundary or could be outside **/ + if (ierase) return(1); /** WRITE RECORD **/ + else return(0); /** SKIP RECORD **/ + } + + if (itouch) + { /** TOUCH **/ + if ( ( (psCShape->dfXMin <= cxmin) || (psCShape->dfXMax >= cxmax) ) && + (psCShape->dfYMin >= cymin) && (psCShape->dfYMax <= cymax) ) + { /** Feature intersects the clip boundary only on the X axis **/ + if (ierase) return(0); /** SKIP RECORD **/ + else return(1); /** WRITE RECORD **/ + } + + if ( (psCShape->dfXMin >= cxmin) && (psCShape->dfXMax <= cxmax) && + ( (psCShape->dfYMin <= cymin) || (psCShape->dfYMax >= cymax) ) ) + { /** Feature intersects the clip boundary only on the Y axis **/ + if (ierase) return(0); /** SKIP RECORD **/ + else return(1); /** WRITE RECORD **/ + } + + for( j2 = 0; j2 < psCShape->nVertices; j2++ ) + { /** At least one vertex must be inside the clip boundary **/ + if ( (psCShape->padfX[j2] >= cxmin && psCShape->padfX[j2] <= cxmax) || + (psCShape->padfY[j2] >= cymin && psCShape->padfY[j2] <= cymax) ) + { + if (ierase) return(0); /** SKIP RECORD **/ + else return(1); /** WRITE RECORD **/ + } + } + + /** All vertices are outside the clip boundary **/ + if (ierase) return(1); /** WRITE RECORD **/ + else return(0); /** SKIP RECORD **/ + } /** End TOUCH **/ + + if (icut) + { /** CUT **/ + /*** Check each vertex in the feature with the Boundary and "CUT" ***/ + /*** THIS CODE WAS NOT COMPLETED! READ NOTE AT THE BOTTOM ***/ + i2=0; + prev_outside=FALSE; + for( j2 = 0; j2 < psCShape->nVertices; j2++ ) + { + inside = psCShape->padfX[j2] >= cxmin && psCShape->padfX[j2] <= cxmax && + psCShape->padfY[j2] >= cymin && psCShape->padfY[j2] <= cymax ; + + if (ierase) inside=(! inside); + if (inside) + { + if (i2 != j2) + { + if (prev_outside) + { + /*** AddIntersection(i2); ***/ /*** Add intersection ***/ + prev_outside=FALSE; + } + psCShape->padfX[i2]=psCShape->padfX[j2]; /** move vertex **/ + psCShape->padfY[i2]=psCShape->padfY[j2]; + } + i2++; + } else { + if ( (! prev_outside) && (j2 > 0) ) + { + /*** AddIntersection(i2); ***//*** Add intersection (Watch out for j2==i2-1) ***/ + /*** Also a polygon may overlap twice and will split into a several parts ***/ + prev_outside=TRUE; + } + } + } + + printf("Vertices:%d OUT:%d Number of Parts:%d\n", + psCShape->nVertices,i2, psCShape->nParts ); + + psCShape->nVertices = i2; + + if (i2 < 2) return(0); /** SKIP RECORD **/ + /*** (WE ARE NOT CREATING INTERESECTIONS and some lines could be reduced to one point) **/ + + if (i2 == 0) return(0); /** SKIP RECORD **/ + else return(1); /** WRITE RECORD **/ + } /** End CUT **/ +} + + +/************************************************************************/ +/* strncasecmp2() */ +/* */ +/* Compare two strings up to n characters */ +/* If n=0 then s1 and s2 must be an exact match */ +/************************************************************************/ + +int strncasecmp2(char *s1, char *s2, int n) + +{ +int j,i; + if (n<1) n=strlen(s1)+1; + for (i=0; i= 'a' && *s1 <= 'z') { + j=*s1-32; + if (j != *s2) return(*s1-*s2); + } else { + if (*s1 >= 'A' && *s1 <= 'Z') { j=*s1+32; } + else { j=*s1; } + if (j != *s2) return(*s1-*s2); + } + } + s1++; + s2++; + } + return(0); +} + + +#define NKEYS (sizeof(unitkeytab) / sizeof(struct unitkey)) +double findunit(char *unit) + { + struct unitkey { + char *name; + double value; + } unitkeytab[] = { + "CM", 39.37, + "CENTIMETER", 39.37, + "CENTIMETERS", 39.37, /** # of inches * 100 in unit **/ + "METER", 3937, + "METERS", 3937, + "KM", 3937000, + "KILOMETER", 3937000, + "KILOMETERS", 3937000, + "INCH", 100, + "INCHES", 100, + "FEET", 1200, + "FOOT", 1200, + "YARD", 3600, + "YARDS", 3600, + "MILE", 6336000, + "MILES", 6336000 + }; + + double unitfactor=0; + for (j = 0; j < NKEYS; j++) { + if (strncasecmp2(unit, unitkeytab[j].name, 0) == 0) unitfactor=unitkeytab[j].value; + } + return(unitfactor); +} + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ +void error() +{ + puts( "The program will append to an existing shape file or it will" ); + puts( "create a new file if needed." ); + puts( "Only the items in the first output file will be preserved." ); + puts( "When an item does not match with the append theme then the item"); + puts( "might be placed to an existing item at the same position and type." ); + puts( " OTHER FUNCTIONS:" ); + puts( " - Describe all items in the dbase file (Use ALL for more than 5000 recs.)"); + puts( " - Select a group of shapes from a comma separated selection list."); + puts( " - UnSelect a group of shapes from a comma separated selection list."); + puts( " - Clip boundary extent or by theme boundary." ); + puts( " Touch writes all the shapes that touch the boundary."); + puts( " Inside writes all the shapes that are completely within the boundary."); + puts( " Boundary clips are only the min and max of a theme boundary." ); + puts( " - Erase boundary extent or by theme boundary." ); + puts( " Erase is the direct opposite of the Clip function." ); + puts( " - Change coordinate value units between meters and feet."); + puts( " There is no way to determine the input unit of a shape file."); + puts( " Skip this function if the shape file is already in the correct unit."); + puts( " Clip and Erase will be done before the unit is changed."); + puts( " A shift will be done after the unit is changed."); + puts( " - Shift X and Y coordinates.\n" ); + puts( "Finally, There can only be one select or unselect in the command line."); + puts( " There can only be one clip or erase in the command line."); + puts( " There can only be one unit and only one shift in the command line.\n"); + puts( "Ex: shputils in.shp out.shp SELECT countycode 3,5,9,13,17,27"); + puts( " shputils in.shp out.shp CLIP 10 10 90 90 Touch FACTOR Meter Feet"); + puts( " shputils in.shp out.shp FACTOR Meter 3.0"); + puts( " shputils in.shp out.shp CLIP clip.shp Boundary Touch SHIFT 40 40"); + puts( " shputils in.shp out.shp SELECT co 112 CLIP clip.shp Boundary Touch\n"); + puts( "USAGE: shputils {ALL}"); + puts( "USAGE: shputils " ); + puts( " { }" ); + puts( " { }" ); + puts( " { }" ); + puts( " { }" ); + puts( " { }" ); + puts( " Note: CUT is not complete and does not create intersections."); + puts( " For more information read programmer comment."); + + /**** Clip functions for Polygon and Cut is not supported + There are several web pages that describe methods of doing this function. + It seem easy to impliment until you start writting code. I don't have the + time to add these functions but a did leave a simple cut routine in the + program that can be called by using CUT instead of TOUCH in the + CLIP or ERASE functions. It does not add the intersection of the line and + the clip box, so polygons could look incomplete and lines will come up short. + + Information about clipping lines with a box: + http://www.csclub.uwaterloo.ca/u/mpslager/articles/sutherland/wr.html + Information about finding the intersection of two lines: + http://www.whisqu.se/per/docs/math28.htm + + THE CODE LOOKS LIKE THIS: + ******************************************************** + void Intersect_Lines(float x0,float y0,float x1,float y1, + float x2,float y2,float x3,float y3, + float *xi,float *yi) + { +// this function computes the intersection of the sent lines +// and returns the intersection point, note that the function assumes +// the lines intersect. the function can handle vertical as well +// as horizontal lines. note the function isn't very clever, it simply +// applies the math, but we don't need speed since this is a +// pre-processing step +// The Intersect_lines program came from (http://www.whisqu.se/per/docs/math28.htm) + +float a1,b1,c1, // constants of linear equations +a2,b2,c2, +det_inv, // the inverse of the determinant of the coefficientmatrix +m1,m2; // the slopes of each line + +// compute slopes, note the cludge for infinity, however, this will +// be close enough +if ((x1-x0)!=0) +m1 = (y1-y0)/(x1-x0); +else +m1 = (float)1e+10; // close enough to infinity + + +if ((x3-x2)!=0) +m2 = (y3-y2)/(x3-x2); +else +m2 = (float)1e+10; // close enough to infinity + +// compute constants +a1 = m1; +a2 = m2; +b1 = -1; +b2 = -1; +c1 = (y0-m1*x0); +c2 = (y2-m2*x2); +// compute the inverse of the determinate +det_inv = 1/(a1*b2 - a2*b1); +// use Kramers rule to compute xi and yi +*xi=((b1*c2 - b2*c1)*det_inv); +*yi=((a2*c1 - a1*c2)*det_inv); +} // end Intersect_Lines + **********************************************************/ + + exit( 1 ); +} diff --git a/support/ShapeLib/test-driver b/support/ShapeLib/test-driver new file mode 100644 index 00000000..8e575b01 --- /dev/null +++ b/support/ShapeLib/test-driver @@ -0,0 +1,148 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2013-07-13.22; # UTC + +# Copyright (C) 2011-2014 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, see . + +# 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. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <$log_file 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>$log_file + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# 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-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/support/ShapeLib/tests/stream1.out b/support/ShapeLib/tests/stream1.out new file mode 100644 index 00000000..de59c441 --- /dev/null +++ b/support/ShapeLib/tests/stream1.out @@ -0,0 +1,1465 @@ +------------------------------------------------------------------------- +Test 1: dump anno.shp +------------------------------------------------------------------------- +Shapefile Type: Polygon # of Shapes: 201 + +File Bounds: ( 471276.281, 4751595.500,0,0) + to ( 492683.536, 4765390.413,0,0) + +Shape:0 (Polygon) nVertices=5, nParts=1 + Bounds:( 486019.130, 4764549.500, 0, 0) + to ( 486356.183, 4765212.744, 0, 0) + ( 486089.531, 4764549.500, 0, 0) Ring + ( 486019.130, 4764579.128, 0, 0) + ( 486285.782, 4765212.744, 0, 0) + ( 486356.183, 4765183.116, 0, 0) + ( 486089.531, 4764549.500, 0, 0) + +Shape:1 (Polygon) nVertices=5, nParts=1 + Bounds:( 484948.275, 4763866.500, 0, 0) + to ( 485333.012, 4764070.376, 0, 0) + ( 484974.719, 4763866.500, 0, 0) Ring + ( 484948.275, 4763938.159, 0, 0) + ( 485306.569, 4764070.376, 0, 0) + ( 485333.012, 4763998.717, 0, 0) + ( 484974.719, 4763866.500, 0, 0) + +Shape:2 (Polygon) nVertices=5, nParts=1 + Bounds:( 485577.021, 4764106.500, 0, 0) + to ( 485818.355, 4764259.305, 0, 0) + ( 485604.156, 4764106.500, 0, 0) Ring + ( 485577.021, 4764177.900, 0, 0) + ( 485791.220, 4764259.305, 0, 0) + ( 485818.355, 4764187.906, 0, 0) + ( 485604.156, 4764106.500, 0, 0) + +Shape:3 (Polygon) nVertices=5, nParts=1 + Bounds:( 484861.500, 4762570.513, 0, 0) + to ( 485092.062, 4763026.856, 0, 0) + ( 485092.062, 4762597.000, 0, 0) Ring + ( 485020.420, 4762570.513, 0, 0) + ( 484861.500, 4763000.370, 0, 0) + ( 484933.143, 4763026.856, 0, 0) + ( 485092.062, 4762597.000, 0, 0) + +Shape:4 (Polygon) nVertices=5, nParts=1 + Bounds:( 484452.624, 4763792.614, 0, 0) + to ( 484628.031, 4764105.947, 0, 0) + ( 484628.031, 4763818.500, 0, 0) Ring + ( 484556.169, 4763792.614, 0, 0) + ( 484452.624, 4764080.061, 0, 0) + ( 484524.486, 4764105.947, 0, 0) + ( 484628.031, 4763818.500, 0, 0) + +Shape:5 (Polygon) nVertices=5, nParts=1 + Bounds:( 484355.352, 4764139.435, 0, 0) + to ( 484505.344, 4764380.892, 0, 0) + ( 484505.344, 4764165.500, 0, 0) Ring + ( 484433.546, 4764139.435, 0, 0) + ( 484355.352, 4764354.827, 0, 0) + ( 484427.150, 4764380.892, 0, 0) + ( 484505.344, 4764165.500, 0, 0) + +Shape:6 (Polygon) nVertices=9, nParts=1 + Bounds:( 484548.866, 4763118.531, 0, 0) + to ( 484772.062, 4763742.258, 0, 0) + ( 484772.062, 4763152.000, 0, 0) Ring + ( 484703.404, 4763118.531, 0, 0) + ( 484605.763, 4763318.832, 0, 0) + ( 484548.866, 4763471.149, 0, 0) + ( 484603.088, 4763742.258, 0, 0) + ( 484677.987, 4763727.278, 0, 0) + ( 484628.031, 4763477.500, 0, 0) + ( 484676.031, 4763349.000, 0, 0) + ( 484772.062, 4763152.000, 0, 0) + +Shape:7 (Polygon) nVertices=5, nParts=1 + Bounds:( 484671.739, 4763562.500, 0, 0) + to ( 484911.415, 4763682.338, 0, 0) + ( 484686.719, 4763562.500, 0, 0) Ring + ( 484671.739, 4763637.399, 0, 0) + ( 484896.435, 4763682.338, 0, 0) + ( 484911.415, 4763607.439, 0, 0) + ( 484686.719, 4763562.500, 0, 0) + +Shape:8 (Polygon) nVertices=5, nParts=1 + Bounds:( 484930.172, 4763125.500, 0, 0) + to ( 485596.342, 4763453.269, 0, 0) + ( 484958.719, 4763125.500, 0, 0) Ring + ( 484930.172, 4763196.347, 0, 0) + ( 485567.795, 4763453.269, 0, 0) + ( 485596.342, 4763382.423, 0, 0) + ( 484958.719, 4763125.500, 0, 0) + +Shape:9 (Polygon) nVertices=5, nParts=1 + Bounds:( 485102.757, 4763082.500, 0, 0) + to ( 485344.154, 4763234.029, 0, 0) + ( 485129.406, 4763082.500, 0, 0) Ring + ( 485102.757, 4763154.083, 0, 0) + ( 485317.505, 4763234.029, 0, 0) + ( 485344.154, 4763162.446, 0, 0) + ( 485129.406, 4763082.500, 0, 0) + +Shape:10 (Polygon) nVertices=5, nParts=1 + Bounds:( 485368.786, 4762538.500, 0, 0) + to ( 485824.016, 4762774.029, 0, 0) + ( 485396.156, 4762538.500, 0, 0) Ring + ( 485368.786, 4762609.810, 0, 0) + ( 485796.646, 4762774.029, 0, 0) + ( 485824.016, 4762702.719, 0, 0) + ( 485396.156, 4762538.500, 0, 0) + +Shape:11 (Polygon) nVertices=5, nParts=1 + Bounds:( 487002.484, 4763184.000, 0, 0) + to ( 487243.960, 4763333.368, 0, 0) + ( 487028.312, 4763184.000, 0, 0) Ring + ( 487002.484, 4763255.883, 0, 0) + ( 487218.132, 4763333.368, 0, 0) + ( 487243.960, 4763261.486, 0, 0) + ( 487028.312, 4763184.000, 0, 0) + +Shape:12 (Polygon) nVertices=5, nParts=1 + Bounds:( 486733.537, 4762455.413, 0, 0) + to ( 487076.312, 4763275.483, 0, 0) + ( 487076.312, 4762480.000, 0, 0) Ring + ( 487003.996, 4762455.413, 0, 0) + ( 486733.537, 4763250.896, 0, 0) + ( 486805.854, 4763275.483, 0, 0) + ( 487076.312, 4762480.000, 0, 0) + +Shape:13 (Polygon) nVertices=5, nParts=1 + Bounds:( 486440.735, 4762331.029, 0, 0) + to ( 486772.281, 4763075.311, 0, 0) + ( 486772.281, 4762357.000, 0, 0) Ring + ( 486700.450, 4762331.029, 0, 0) + ( 486440.735, 4763049.339, 0, 0) + ( 486512.566, 4763075.311, 0, 0) + ( 486772.281, 4762357.000, 0, 0) + +Shape:14 (Polygon) nVertices=5, nParts=1 + Bounds:( 486383.882, 4762986.530, 0, 0) + to ( 486521.594, 4763227.908, 0, 0) + ( 486521.594, 4763008.000, 0, 0) Ring + ( 486448.291, 4762986.530, 0, 0) + ( 486383.882, 4763206.438, 0, 0) + ( 486457.184, 4763227.908, 0, 0) + ( 486521.594, 4763008.000, 0, 0) + +Shape:15 (Polygon) nVertices=9, nParts=1 + Bounds:( 486360.416, 4762774.310, 0, 0) + to ( 486800.882, 4763656.208, 0, 0) + ( 486489.594, 4763600.000, 0, 0) Ring + ( 486541.313, 4763656.208, 0, 0) + ( 486762.057, 4763453.094, 0, 0) + ( 486800.882, 4763266.659, 0, 0) + ( 486420.883, 4762774.310, 0, 0) + ( 486360.416, 4762820.979, 0, 0) + ( 486718.938, 4763285.500, 0, 0) + ( 486692.281, 4763413.500, 0, 0) + ( 486489.594, 4763600.000, 0, 0) + +Shape:16 (Polygon) nVertices=5, nParts=1 + Bounds:( 486682.872, 4762181.000, 0, 0) + to ( 487292.496, 4762415.463, 0, 0) + ( 486702.969, 4762181.000, 0, 0) Ring + ( 486682.872, 4762254.691, 0, 0) + ( 487272.400, 4762415.463, 0, 0) + ( 487292.496, 4762341.772, 0, 0) + ( 486702.969, 4762181.000, 0, 0) + +Shape:17 (Polygon) nVertices=5, nParts=1 + Bounds:( 487480.713, 4762283.320, 0, 0) + to ( 487732.406, 4762812.552, 0, 0) + ( 487732.406, 4762309.000, 0, 0) Ring + ( 487660.470, 4762283.320, 0, 0) + ( 487480.713, 4762786.872, 0, 0) + ( 487552.649, 4762812.552, 0, 0) + ( 487732.406, 4762309.000, 0, 0) + +Shape:18 (Polygon) nVertices=5, nParts=1 + Bounds:( 487069.757, 4763685.709, 0, 0) + to ( 487220.344, 4763927.145, 0, 0) + ( 487220.344, 4763712.000, 0, 0) Ring + ( 487148.629, 4763685.709, 0, 0) + ( 487069.757, 4763900.854, 0, 0) + ( 487141.471, 4763927.145, 0, 0) + ( 487220.344, 4763712.000, 0, 0) + +Shape:19 (Polygon) nVertices=9, nParts=1 + Bounds:( 487854.719, 4758279.000, 0, 0) + to ( 488518.085, 4758475.003, 0, 0) + ( 487854.719, 4758404.000, 0, 0) Ring + ( 487882.875, 4758475.003, 0, 0) + ( 488183.362, 4758355.845, 0, 0) + ( 488341.273, 4758360.840, 0, 0) + ( 488515.420, 4758366.919, 0, 0) + ( 488518.085, 4758290.583, 0, 0) + ( 488343.812, 4758284.500, 0, 0) + ( 488169.938, 4758279.000, 0, 0) + ( 487854.719, 4758404.000, 0, 0) + +Shape:20 (Polygon) nVertices=5, nParts=1 + Bounds:( 486300.557, 4758366.000, 0, 0) + to ( 486613.245, 4758546.262, 0, 0) + ( 486327.781, 4758366.000, 0, 0) Ring + ( 486300.557, 4758437.366, 0, 0) + ( 486586.021, 4758546.262, 0, 0) + ( 486613.245, 4758474.896, 0, 0) + ( 486327.781, 4758366.000, 0, 0) + +Shape:21 (Polygon) nVertices=5, nParts=1 + Bounds:( 486709.618, 4758518.000, 0, 0) + to ( 486949.999, 4758681.145, 0, 0) + ( 486740.750, 4758518.000, 0, 0) Ring + ( 486709.618, 4758587.750, 0, 0) + ( 486918.867, 4758681.145, 0, 0) + ( 486949.999, 4758611.396, 0, 0) + ( 486740.750, 4758518.000, 0, 0) + +Shape:22 (Polygon) nVertices=5, nParts=1 + Bounds:( 487325.398, 4757807.034, 0, 0) + to ( 487555.844, 4758263.402, 0, 0) + ( 487555.844, 4757833.500, 0, 0) Ring + ( 487484.193, 4757807.034, 0, 0) + ( 487325.398, 4758236.937, 0, 0) + ( 487397.049, 4758263.402, 0, 0) + ( 487555.844, 4757833.500, 0, 0) + +Shape:23 (Polygon) nVertices=5, nParts=1 + Bounds:( 487255.256, 4758215.573, 0, 0) + to ( 487387.406, 4758456.611, 0, 0) + ( 487387.406, 4758235.000, 0, 0) Ring + ( 487313.536, 4758215.573, 0, 0) + ( 487255.256, 4758437.184, 0, 0) + ( 487329.126, 4758456.611, 0, 0) + ( 487387.406, 4758235.000, 0, 0) + +Shape:24 (Polygon) nVertices=5, nParts=1 + Bounds:( 487248.714, 4758360.500, 0, 0) + to ( 487559.687, 4758550.761, 0, 0) + ( 487278.719, 4758360.500, 0, 0) Ring + ( 487248.714, 4758430.742, 0, 0) + ( 487529.682, 4758550.761, 0, 0) + ( 487559.687, 4758480.519, 0, 0) + ( 487278.719, 4758360.500, 0, 0) + +Shape:25 (Polygon) nVertices=5, nParts=1 + Bounds:( 487573.994, 4758496.500, 0, 0) + to ( 487815.502, 4758644.603, 0, 0) + ( 487599.344, 4758496.500, 0, 0) Ring + ( 487573.994, 4758568.553, 0, 0) + ( 487790.152, 4758644.603, 0, 0) + ( 487815.502, 4758572.550, 0, 0) + ( 487599.344, 4758496.500, 0, 0) +------------------------------------------------------------------------- +Test 2: dump brklinz.shp +------------------------------------------------------------------------- +Shapefile Type: ArcZ # of Shapes: 122 + +File Bounds: ( 6294338.260, 1978444.010,0,0) + to ( 6296321.860, 1979694.450,0,0) + +Shape:0 (ArcZ) nVertices=92, nParts=1 + Bounds:( 6294700.210, 1978579.390, 818.64, 0) + to ( 6295395.930, 1979050.330, 917.86, 0) + ( 6295372.750, 1978755.830, 823.06, 0) Ring + ( 6295366.170, 1978739.190, 826.58, 0) + ( 6295360.400, 1978718.540, 829.2, 0) + ( 6295352.620, 1978697.000, 832.22, 0) + ( 6295345.960, 1978677.040, 834.64, 0) + ( 6295339.690, 1978656.810, 838.51, 0) + ( 6295335.040, 1978637.600, 840.94, 0) + ( 6295331.080, 1978621.450, 844.48, 0) + ( 6295324.350, 1978607.940, 847.04, 0) + ( 6295313.370, 1978598.450, 850.38, 0) + ( 6295296.780, 1978594.950, 853.27, 0) + ( 6295273.800, 1978594.990, 858.06, 0) + ( 6295251.750, 1978595.380, 861.53, 0) + ( 6295232.340, 1978598.400, 864.22, 0) + ( 6295206.740, 1978606.390, 866.38, 0) + ( 6295180.610, 1978616.970, 868.15, 0) + ( 6295156.350, 1978630.540, 870.65, 0) + ( 6295132.270, 1978645.210, 872.02, 0) + ( 6295111.070, 1978659.740, 875.17, 0) + ( 6295090.030, 1978674.920, 878.84, 0) + ( 6295071.060, 1978689.340, 882.06, 0) + ( 6295051.900, 1978705.080, 886.98, 0) + ( 6295036.460, 1978719.260, 889.66, 0) + ( 6295023.620, 1978732.910, 893.53, 0) + ( 6295010.450, 1978750.380, 895.24, 0) + ( 6294999.910, 1978767.850, 897.47, 0) + ( 6294989.810, 1978783.860, 900.29, 0) + ( 6294975.040, 1978795.570, 902.45, 0) + ( 6294956.300, 1978806.830, 906.32, 0) + ( 6294937.260, 1978814.620, 909.21, 0) + ( 6294919.240, 1978821.960, 912.88, 0) + ( 6294897.040, 1978832.210, 915.04, 0) + ( 6294878.070, 1978844.070, 916.49, 0) + ( 6294865.010, 1978855.820, 917.34, 0) + ( 6294859.560, 1978870.150, 916.81, 0) + ( 6294861.520, 1978882.920, 916.62, 0) + ( 6294874.640, 1978906.220, 917.86, 0) + ( 6294886.980, 1978926.880, 917.6, 0) + ( 6294889.630, 1978953.270, 917.54, 0) + ( 6294888.520, 1978978.280, 916.88, 0) + ( 6294880.350, 1978998.390, 915.96, 0) + ( 6294866.540, 1979018.920, 915.57, 0) + ( 6294843.270, 1979039.140, 915.57, 0) + ( 6294812.250, 1979049.040, 915.96, 0) + ( 6294777.640, 1979050.330, 916.75, 0) + ( 6294752.060, 1979040.520, 916.68, 0) + ( 6294730.990, 1979028.850, 916.62, 0) + ( 6294716.690, 1979008.420, 916.62, 0) + ( 6294706.050, 1978987.490, 916.95, 0) + ( 6294700.210, 1978965.390, 916.95, 0) + ( 6294700.520, 1978937.670, 917.01, 0) + ( 6294712.060, 1978911.340, 916.95, 0) + ( 6294724.820, 1978893.560, 916.62, 0) + ( 6294741.630, 1978878.010, 916.36, 0) + ( 6294759.360, 1978865.090, 916.36, 0) + ( 6294777.650, 1978855.370, 916.22, 0) + ( 6294807.570, 1978846.970, 916.36, 0) + ( 6294837.640, 1978836.590, 916.55, 0) + ( 6294858.650, 1978831.390, 916.29, 0) + ( 6294878.860, 1978825.840, 915.37, 0) + ( 6294897.630, 1978817.860, 913.67, 0) + ( 6294914.550, 1978809.520, 910.78, 0) + ( 6294932.380, 1978798.580, 907.17, 0) + ( 6294947.360, 1978788.370, 904.42, 0) + ( 6294960.500, 1978778.120, 901.86, 0) + ( 6294974.780, 1978761.900, 898.78, 0) + ( 6294988.510, 1978747.610, 895.7, 0) + ( 6295005.230, 1978730.220, 892.81, 0) + ( 6295023.560, 1978713.470, 889.34, 0) + ( 6295043.310, 1978696.320, 885.07, 0) + ( 6295061.830, 1978680.810, 881.47, 0) + ( 6295080.970, 1978664.550, 877.79, 0) + ( 6295104.570, 1978648.190, 874.58, 0) + ( 6295126.310, 1978633.890, 872.09, 0) + ( 6295149.840, 1978618.720, 869.6, 0) + ( 6295173.840, 1978605.030, 867.37, 0) + ( 6295198.110, 1978594.150, 866.12, 0) + ( 6295222.830, 1978586.990, 865.2, 0) + ( 6295243.030, 1978583.810, 863.5, 0) + ( 6295268.110, 1978581.290, 860.35, 0) + ( 6295291.530, 1978579.390, 856.48, 0) + ( 6295313.200, 1978582.040, 852.42, 0) + ( 6295329.170, 1978591.410, 848.81, 0) + ( 6295339.780, 1978603.880, 845.07, 0) + ( 6295345.640, 1978621.110, 842.12, 0) + ( 6295351.070, 1978642.970, 838.32, 0) + ( 6295357.250, 1978666.560, 834.77, 0) + ( 6295367.290, 1978691.000, 831.89, 0) + ( 6295376.030, 1978718.470, 828.09, 0) + ( 6295383.930, 1978744.860, 824.35, 0) + ( 6295389.990, 1978768.720, 821.33, 0) + ( 6295395.930, 1978790.090, 818.64, 0) + +Shape:1 (ArcZ) nVertices=9, nParts=1 + Bounds:( 6295218.470, 1978444.010, 864.55, 0) + to ( 6295330.760, 1978581.880, 882.45, 0) + ( 6295330.760, 1978444.010, 882.45, 0) Ring + ( 6295306.050, 1978461.190, 880.94, 0) + ( 6295280.210, 1978482.710, 878.52, 0) + ( 6295258.180, 1978504.050, 875.89, 0) + ( 6295239.910, 1978524.670, 871.89, 0) + ( 6295225.650, 1978546.540, 869.53, 0) + ( 6295218.470, 1978565.550, 866.97, 0) + ( 6295223.960, 1978575.510, 865.27, 0) + ( 6295230.580, 1978581.880, 864.55, 0) + +Shape:2 (ArcZ) nVertices=10, nParts=1 + Bounds:( 6295199.220, 1978444.010, 866.32, 0) + to ( 6295309.040, 1978588.800, 882.08, 0) + ( 6295200.070, 1978588.800, 866.32, 0) Ring + ( 6295199.220, 1978571.840, 867.24, 0) + ( 6295200.770, 1978555.740, 868.88, 0) + ( 6295207.890, 1978538.040, 869.86, 0) + ( 6295223.020, 1978520.530, 870.84, 0) + ( 6295239.450, 1978502.440, 874.06, 0) + ( 6295258.050, 1978483.440, 876.48, 0) + ( 6295268.990, 1978473.760, 879.17, 0) + ( 6295285.710, 1978461.560, 880.55, 0) + ( 6295309.040, 1978444.010, 882.08, 0) + +Shape:3 (ArcZ) nVertices=5, nParts=1 + Bounds:( 6294340.890, 1979449.280, 1031.78, 0) + to ( 6294394.080, 1979522.030, 1039.78, 0) + ( 6294394.080, 1979449.280, 1039.78, 0) Ring + ( 6294378.800, 1979469.230, 1038.73, 0) + ( 6294364.980, 1979486.740, 1037.28, 0) + ( 6294350.800, 1979504.980, 1035.12, 0) + ( 6294340.890, 1979522.030, 1031.78, 0) + +Shape:4 (ArcZ) nVertices=6, nParts=1 + Bounds:( 6294344.380, 1979583.450, 1008.04, 0) + to ( 6294354.670, 1979678.070, 1023.45, 0) + ( 6294344.380, 1979583.450, 1023.45, 0) Ring + ( 6294348.050, 1979601.580, 1019.18, 0) + ( 6294349.570, 1979621.200, 1016.5, 0) + ( 6294351.990, 1979637.890, 1012.95, 0) + ( 6294353.090, 1979657.140, 1011.51, 0) + ( 6294354.670, 1979678.070, 1008.04, 0) + +Shape:5 (ArcZ) nVertices=3, nParts=1 + Bounds:( 6294338.260, 1979628.600, 1008.63, 0) + to ( 6294341.080, 1979674.100, 1015.71, 0) + ( 6294341.080, 1979674.100, 1008.63, 0) Ring + ( 6294339.460, 1979649.880, 1011.71, 0) + ( 6294338.260, 1979628.600, 1015.71, 0) + +Shape:6 (ArcZ) nVertices=3, nParts=1 + Bounds:( 6294350.160, 1979437.980, 1038.6, 0) + to ( 6294379.980, 1979476.720, 1040.1, 0) + ( 6294350.160, 1979476.720, 1038.6, 0) Ring + ( 6294368.100, 1979454.860, 1040.1, 0) + ( 6294379.980, 1979437.980, 1039.32, 0) + +Shape:7 (ArcZ) nVertices=39, nParts=1 + Bounds:( 6295371.530, 1978758.160, 754.11, 0) + to ( 6295534.560, 1979677.750, 823.3, 0) + ( 6295534.560, 1979677.750, 779.95, 0) Ring + ( 6295534.380, 1979648.150, 778.57, 0) + ( 6295534.480, 1979605.990, 775.16, 0) + ( 6295533.970, 1979577.580, 772.21, 0) + ( 6295532.310, 1979547.260, 768.41, 0) + ( 6295532.970, 1979521.290, 763.82, 0) + ( 6295532.390, 1979496.890, 759.1, 0) + ( 6295532.940, 1979474.010, 755.49, 0) + ( 6295533.680, 1979452.180, 754.11, 0) + ( 6295533.850, 1979434.640, 754.11, 0) + ( 6295532.170, 1979409.180, 755.75, 0) + ( 6295531.580, 1979384.450, 758.7, 0) + ( 6295531.590, 1979356.090, 760.28, 0) + ( 6295530.190, 1979325.690, 761.13, 0) + ( 6295530.020, 1979291.090, 761.66, 0) + ( 6295529.210, 1979259.420, 762.7, 0) + ( 6295526.250, 1979221.610, 762.77, 0) + ( 6295524.260, 1979187.500, 763.75, 0) + ( 6295522.640, 1979155.350, 764.61, 0) + ( 6295521.540, 1979123.230, 765.33, 0) + ( 6295518.460, 1979096.000, 765.92, 0) + ( 6295511.670, 1979081.110, 767.16, 0) + ( 6295500.700, 1979064.060, 768.41, 0) + ( 6295489.330, 1979049.600, 770.11, 0) + ( 6295475.500, 1979033.100, 773.07, 0) + ( 6295462.530, 1979018.190, 775.16, 0) + ( 6295447.760, 1979001.400, 779.49, 0) + ( 6295433.380, 1978984.530, 782.9, 0) + ( 6295419.040, 1978965.820, 785.92, 0) + ( 6295409.020, 1978946.820, 790.58, 0) + ( 6295399.860, 1978923.910, 795.1, 0) + ( 6295391.010, 1978894.410, 800.94, 0) + ( 6295387.440, 1978875.550, 805.53, 0) + ( 6295382.030, 1978849.030, 809.79, 0) + ( 6295382.190, 1978828.930, 813.33, 0) + ( 6295383.570, 1978809.290, 817.4, 0) + ( 6295380.880, 1978789.860, 819.69, 0) + ( 6295375.630, 1978771.810, 822.58, 0) + ( 6295371.530, 1978758.160, 823.3, 0) + +Shape:8 (ArcZ) nVertices=35, nParts=1 + Bounds:( 6295396.480, 1978794.780, 753.98, 0) + to ( 6295549.010, 1979670.060, 818.58, 0) + ( 6295396.620, 1978794.780, 818.58, 0) Ring + ( 6295397.330, 1978816.670, 815.76, 0) + ( 6295396.480, 1978836.150, 812.22, 0) + ( 6295397.670, 1978857.110, 807.95, 0) + ( 6295401.180, 1978874.720, 804.61, 0) + ( 6295406.260, 1978897.320, 799.95, 0) + ( 6295413.580, 1978919.930, 794.77, 0) + ( 6295421.330, 1978938.190, 790.31, 0) + ( 6295431.450, 1978956.590, 786.51, 0) + ( 6295444.950, 1978974.360, 782.38, 0) + ( 6295461.420, 1978993.620, 777.66, 0) + ( 6295479.760, 1979013.510, 773.26, 0) + ( 6295494.630, 1979032.330, 771.1, 0) + ( 6295510.990, 1979052.120, 767.69, 0) + ( 6295524.170, 1979071.090, 766.84, 0) + ( 6295532.180, 1979091.890, 765.33, 0) + ( 6295536.530, 1979120.830, 764.8, 0) + ( 6295537.480, 1979150.200, 764.08, 0) + ( 6295539.470, 1979189.490, 763.43, 0) + ( 6295541.670, 1979230.490, 762.64, 0) + ( 6295541.760, 1979271.330, 761.79, 0) + ( 6295543.650, 1979306.300, 761.46, 0) + ( 6295544.470, 1979335.540, 760.47, 0) + ( 6295544.960, 1979363.490, 759.23, 0) + ( 6295545.620, 1979392.020, 757.13, 0) + ( 6295546.340, 1979419.430, 754.9, 0) + ( 6295547.120, 1979439.940, 753.98, 0) + ( 6295546.510, 1979459.150, 754.38, 0) + ( 6295545.460, 1979482.710, 757.66, 0) + ( 6295545.530, 1979507.330, 761.13, 0) + ( 6295545.610, 1979532.470, 765.59, 0) + ( 6295546.490, 1979565.520, 770.44, 0) + ( 6295547.960, 1979597.100, 775.03, 0) + ( 6295548.990, 1979628.040, 777.26, 0) + ( 6295549.010, 1979670.060, 780.15, 0) + +Shape:9 (ArcZ) nVertices=45, nParts=1 + Bounds:( 6295694.040, 1978444.010, 696.95, 0) + to ( 6296208.790, 1979687.080, 787.43, 0) + ( 6295698.400, 1979687.080, 787.43, 0) Ring + ( 6295694.040, 1979670.950, 786.31, 0) + ( 6295696.410, 1979650.280, 785.13, 0) + ( 6295700.080, 1979634.530, 784.8, 0) + ( 6295704.080, 1979620.010, 784.15, 0) + ( 6295708.420, 1979601.930, 782.44, 0) + ( 6295711.230, 1979584.790, 781.99, 0) + ( 6295712.060, 1979564.780, 780.8, 0) + ( 6295710.550, 1979537.480, 779.69, 0) + ( 6295711.290, 1979508.020, 777.59, 0) + ( 6295710.010, 1979477.420, 776.08, 0) + ( 6295709.300, 1979442.530, 773.59, 0) + ( 6295709.160, 1979413.640, 772.21, 0) + ( 6295707.090, 1979372.570, 769.46, 0) + ( 6295708.140, 1979336.210, 767.49, 0) + ( 6295709.710, 1979297.130, 764.67, 0) + ( 6295710.960, 1979272.310, 763.29, 0) + ( 6295714.640, 1979241.200, 761.2, 0) + ( 6295719.050, 1979211.560, 759.82, 0) + ( 6295724.280, 1979179.840, 758.31, 0) + ( 6295729.460, 1979152.460, 756.74, 0) + ( 6295735.770, 1979126.530, 754.44, 0) + ( 6295744.970, 1979095.400, 752.87, 0) + ( 6295755.820, 1979063.140, 750.31, 0) + ( 6295767.590, 1979028.330, 747.62, 0) + ( 6295782.240, 1978993.450, 744.21, 0) + ( 6295801.580, 1978952.420, 741.26, 0) + ( 6295825.730, 1978905.370, 736.87, 0) + ( 6295842.330, 1978877.810, 734.7, 0) + ( 6295859.110, 1978851.150, 731.55, 0) + ( 6295875.620, 1978827.010, 729.52, 0) + ( 6295899.080, 1978794.830, 727.42, 0) + ( 6295923.640, 1978763.720, 724.34, 0) + ( 6295949.340, 1978734.180, 721.39, 0) + ( 6295975.020, 1978704.320, 718.57, 0) + ( 6296000.320, 1978677.440, 716.01, 0) + ( 6296026.940, 1978648.120, 713.45, 0) + ( 6296053.500, 1978617.500, 709.78, 0) + ( 6296078.620, 1978589.630, 706.9, 0) + ( 6296098.880, 1978566.880, 704.47, 0) + ( 6296126.050, 1978537.930, 702.37, 0) + ( 6296150.670, 1978507.990, 700.14, 0) + ( 6296179.280, 1978476.280, 698.7, 0) + ( 6296208.030, 1978444.880, 696.99, 0) + ( 6296208.790, 1978444.010, 696.95, 0) + +Shape:10 (ArcZ) nVertices=10, nParts=1 + Bounds:( 6296270.060, 1979014.970, 712.54, 0) + to ( 6296315.990, 1979152.310, 725.13, 0) + ( 6296306.110, 1979152.310, 725.13, 0) Ring + ( 6296288.270, 1979139.690, 723.42, 0) + ( 6296276.630, 1979122.410, 721.98, 0) + ( 6296270.060, 1979101.470, 719.95, 0) + ( 6296270.390, 1979084.580, 719.36, 0) + ( 6296275.110, 1979068.970, 717.26, 0) + ( 6296284.280, 1979052.820, 716.41, 0) + ( 6296294.680, 1979040.410, 715.49, 0) + ( 6296305.720, 1979027.370, 713.59, 0) + ( 6296315.990, 1979014.970, 712.54, 0) + +Shape:11 (ArcZ) nVertices=18, nParts=1 + Bounds:( 6296044.930, 1978451.120, 690.11, 0) + to ( 6296312.920, 1978679.190, 713.72, 0) + ( 6296312.920, 1978493.560, 690.11, 0) Ring + ( 6296301.160, 1978479.050, 690.9, 0) + ( 6296287.840, 1978464.950, 692.4, 0) + ( 6296276.430, 1978454.890, 693.58, 0) + ( 6296262.580, 1978451.120, 694.44, 0) + ( 6296249.650, 1978452.500, 694.9, 0) + ( 6296237.110, 1978461.670, 696.08, 0) + ( 6296223.600, 1978477.650, 697.78, 0) + ( 6296209.320, 1978493.930, 698.7, 0) + ( 6296193.640, 1978511.140, 699.16, 0) + ( 6296176.980, 1978529.710, 700.6, 0) + ( 6296157.700, 1978550.970, 701.98, 0) + ( 6296136.720, 1978574.950, 703.49, 0) + ( 6296121.400, 1978591.550, 705.39, 0) + ( 6296102.290, 1978613.590, 707.36, 0) + ( 6296084.440, 1978634.580, 709.13, 0) + ( 6296065.890, 1978654.760, 711.29, 0) + ( 6296044.930, 1978679.190, 713.72, 0) + +Shape:12 (ArcZ) nVertices=71, nParts=1 + Bounds:( 6295741.070, 1978679.190, 713.72, 0) + to ( 6296321.860, 1979680.370, 813.79, 0) + ( 6296044.930, 1978679.190, 713.72, 0) Ring + ( 6296025.660, 1978700.780, 716.6, 0) + ( 6296006.480, 1978721.510, 718.37, 0) + ( 6295987.070, 1978742.720, 721, 0) + ( 6295970.410, 1978761.420, 722.44, 0) + ( 6295953.490, 1978780.070, 724.28, 0) + ( 6295932.470, 1978805.820, 726.44, 0) + ( 6295913.490, 1978830.550, 728.67, 0) + ( 6295896.490, 1978855.310, 731.16, 0) + ( 6295881.220, 1978878.070, 733.39, 0) + ( 6295867.710, 1978899.180, 734.7, 0) + ( 6295853.950, 1978923.310, 737, 0) + ( 6295839.810, 1978950.030, 739.56, 0) + ( 6295825.270, 1978979.390, 742.11, 0) + ( 6295809.100, 1979015.600, 745.46, 0) + ( 6295796.940, 1979045.170, 748.02, 0) + ( 6295785.770, 1979078.900, 750.97, 0) + ( 6295777.080, 1979104.550, 752.54, 0) + ( 6295768.950, 1979133.460, 754.84, 0) + ( 6295762.170, 1979163.090, 756.87, 0) + ( 6295755.640, 1979194.930, 758.9, 0) + ( 6295750.610, 1979225.390, 760.48, 0) + ( 6295746.300, 1979259.750, 762.64, 0) + ( 6295743.320, 1979291.750, 764.54, 0) + ( 6295741.650, 1979321.060, 766.64, 0) + ( 6295741.070, 1979353.790, 768.54, 0) + ( 6295741.170, 1979384.450, 770.71, 0) + ( 6295742.010, 1979419.210, 772.48, 0) + ( 6295743.010, 1979454.740, 774.44, 0) + ( 6295743.910, 1979493.310, 776.94, 0) + ( 6295744.990, 1979530.290, 778.97, 0) + ( 6295745.900, 1979569.120, 781.46, 0) + ( 6295745.940, 1979603.910, 783.3, 0) + ( 6295747.600, 1979636.660, 785.85, 0) + ( 6295751.850, 1979653.260, 787.49, 0) + ( 6295760.490, 1979665.820, 788.87, 0) + ( 6295773.510, 1979673.830, 790.18, 0) + ( 6295788.460, 1979676.100, 791.95, 0) + ( 6295823.990, 1979674.960, 793.46, 0) + ( 6295871.620, 1979674.070, 796.94, 0) + ( 6295918.980, 1979673.120, 798.97, 0) + ( 6295971.200, 1979672.130, 802.25, 0) + ( 6296019.370, 1979671.600, 803.95, 0) + ( 6296054.350, 1979670.030, 805.92, 0) + ( 6296074.580, 1979662.250, 806.58, 0) + ( 6296085.660, 1979647.700, 806.97, 0) + ( 6296089.370, 1979635.300, 807.69, 0) + ( 6296086.380, 1979620.160, 808.61, 0) + ( 6296080.060, 1979601.690, 810.32, 0) + ( 6296074.440, 1979583.990, 811.17, 0) + ( 6296070.250, 1979568.770, 812.22, 0) + ( 6296072.470, 1979552.830, 812.94, 0) + ( 6296083.220, 1979536.790, 813.46, 0) + ( 6296102.650, 1979531.410, 813.79, 0) + ( 6296121.290, 1979536.450, 813.73, 0) + ( 6296133.190, 1979548.520, 813.2, 0) + ( 6296138.010, 1979563.380, 812.61, 0) + ( 6296135.460, 1979580.580, 811.37, 0) + ( 6296129.950, 1979598.850, 810.18, 0) + ( 6296124.490, 1979618.170, 809.46, 0) + ( 6296122.100, 1979635.880, 808.35, 0) + ( 6296126.820, 1979651.410, 807.36, 0) + ( 6296136.390, 1979661.360, 806.51, 0) + ( 6296149.630, 1979666.080, 806.05, 0) + ( 6296163.380, 1979667.880, 805.73, 0) + ( 6296186.080, 1979667.460, 805.14, 0) + ( 6296215.190, 1979666.580, 805, 0) + ( 6296247.690, 1979667.830, 803.5, 0) + ( 6296273.580, 1979670.850, 802.32, 0) + ( 6296295.410, 1979674.090, 800.68, 0) + ( 6296321.860, 1979680.370, 799.23, 0) + +Shape:13 (ArcZ) nVertices=6, nParts=1 + Bounds:( 6295372.650, 1979608.700, 773.19, 0) + to ( 6295470.330, 1979679.550, 780.15, 0) + ( 6295372.650, 1979679.550, 780.15, 0) Ring + ( 6295387.140, 1979664.770, 777.85, 0) + ( 6295406.650, 1979645.400, 776.21, 0) + ( 6295422.760, 1979631.580, 775.29, 0) + ( 6295442.800, 1979612.190, 773.65, 0) + ( 6295470.330, 1979608.700, 773.19, 0) + +Shape:14 (ArcZ) nVertices=7, nParts=1 + Bounds:( 6295415.710, 1979491.540, 772.08, 0) + to ( 6295453.550, 1979590.190, 773.85, 0) + ( 6295453.550, 1979590.110, 772.09, 0) Ring + ( 6295453.110, 1979590.190, 772.08, 0) + ( 6295439.430, 1979579.260, 772.74, 0) + ( 6295430.870, 1979552.770, 772.93, 0) + ( 6295420.940, 1979527.860, 773.19, 0) + ( 6295415.710, 1979510.070, 773.79, 0) + ( 6295421.080, 1979491.540, 773.85, 0) + +Shape:15 (ArcZ) nVertices=9, nParts=1 + Bounds:( 6295351.240, 1979521.410, 773, 0) + to ( 6295430.330, 1979692.520, 782.11, 0) + ( 6295395.270, 1979521.410, 774.51, 0) Ring + ( 6295415.880, 1979549.790, 773.85, 0) + ( 6295426.030, 1979579.220, 773, 0) + ( 6295430.330, 1979604.610, 773.06, 0) + ( 6295418.610, 1979622.140, 774.31, 0) + ( 6295398.970, 1979639.020, 776.34, 0) + ( 6295382.220, 1979655.690, 778.31, 0) + ( 6295365.040, 1979674.420, 780.15, 0) + ( 6295351.240, 1979692.520, 782.11, 0) + +Shape:16 (ArcZ) nVertices=28, nParts=1 + Bounds:( 6294520.270, 1979256.990, 932.36, 0) + to ( 6294743.290, 1979675.030, 1016.69, 0) + ( 6294531.940, 1979675.030, 932.36, 0) Ring + ( 6294523.870, 1979650.550, 933.54, 0) + ( 6294520.270, 1979620.920, 936.75, 0) + ( 6294525.030, 1979592.840, 940.29, 0) + ( 6294533.880, 1979567.770, 942.98, 0) + ( 6294546.040, 1979543.320, 949.28, 0) + ( 6294564.140, 1979524.750, 951.64, 0) + ( 6294585.590, 1979515.130, 956.36, 0) + ( 6294611.810, 1979503.890, 959.38, 0) + ( 6294635.130, 1979494.900, 966.2, 0) + ( 6294662.590, 1979487.470, 969.41, 0) + ( 6294687.540, 1979482.070, 971.77, 0) + ( 6294710.180, 1979470.160, 976.75, 0) + ( 6294732.150, 1979450.140, 978.53, 0) + ( 6294743.290, 1979431.460, 981.94, 0) + ( 6294738.700, 1979402.930, 984.69, 0) + ( 6294731.290, 1979380.980, 986.79, 0) + ( 6294717.670, 1979358.290, 988.3, 0) + ( 6294706.340, 1979342.050, 991.38, 0) + ( 6294697.140, 1979315.920, 996.76, 0) + ( 6294696.360, 1979292.580, 1000.17, 0) + ( 6294691.930, 1979275.010, 1002.4, 0) + ( 6294681.970, 1979259.950, 1004.76, 0) + ( 6294665.150, 1979256.990, 1006.53, 0) + ( 6294638.580, 1979258.930, 1010.33, 0) + ( 6294617.350, 1979259.730, 1012.76, 0) + ( 6294592.000, 1979262.260, 1015.32, 0) + ( 6294572.550, 1979262.000, 1016.69, 0) + +Shape:17 (ArcZ) nVertices=43, nParts=1 + Bounds:( 6294466.100, 1979253.610, 930.98, 0) + to ( 6294720.520, 1979678.410, 1018.46, 0) + ( 6294572.550, 1979262.000, 1016.69, 0) Ring + ( 6294549.640, 1979260.720, 1017.48, 0) + ( 6294522.440, 1979260.520, 1017.48, 0) + ( 6294472.060, 1979253.610, 1016.63, 0) + ( 6294469.530, 1979302.330, 1017.15, 0) + ( 6294466.100, 1979341.240, 1016.63, 0) + ( 6294469.480, 1979374.290, 1016.5, 0) + ( 6294506.640, 1979382.010, 1016.96, 0) + ( 6294538.320, 1979377.390, 1016.89, 0) + ( 6294581.400, 1979377.510, 1017.74, 0) + ( 6294603.050, 1979366.770, 1017.74, 0) + ( 6294597.820, 1979338.470, 1018, 0) + ( 6294587.060, 1979307.490, 1018.46, 0) + ( 6294579.280, 1979283.460, 1017.87, 0) + ( 6294593.320, 1979278.020, 1016.36, 0) + ( 6294613.160, 1979275.640, 1013.15, 0) + ( 6294634.390, 1979274.630, 1009.54, 0) + ( 6294650.590, 1979272.960, 1006.4, 0) + ( 6294666.970, 1979274.830, 1003.77, 0) + ( 6294675.710, 1979289.290, 1001.81, 0) + ( 6294681.310, 1979309.230, 998.13, 0) + ( 6294686.190, 1979327.900, 995.64, 0) + ( 6294692.280, 1979346.960, 991.64, 0) + ( 6294699.730, 1979367.200, 989.08, 0) + ( 6294709.530, 1979384.310, 985.74, 0) + ( 6294716.160, 1979401.370, 983.25, 0) + ( 6294720.520, 1979414.810, 980.1, 0) + ( 6294718.980, 1979441.480, 978, 0) +------------------------------------------------------------------------- +Test 3: dump polygon.shp +------------------------------------------------------------------------- +Shapefile Type: Polygon # of Shapes: 474 + +File Bounds: ( 471127.188, 4751545.000,0,0) + to ( 489292.312, 4765610.500,0,0) + +Shape:0 (Polygon) nVertices=20, nParts=1 + Bounds:( 479647.000, 4764856.500, 0, 0) + to ( 480389.688, 4765610.500, 0, 0) + ( 479819.844, 4765180.500, 0, 0) Ring + ( 479690.188, 4765259.500, 0, 0) + ( 479647.000, 4765369.500, 0, 0) + ( 479730.375, 4765400.500, 0, 0) + ( 480039.031, 4765539.500, 0, 0) + ( 480035.344, 4765558.500, 0, 0) + ( 480159.781, 4765610.500, 0, 0) + ( 480202.281, 4765482.000, 0, 0) + ( 480365.000, 4765015.500, 0, 0) + ( 480389.688, 4764950.000, 0, 0) + ( 480133.969, 4764856.500, 0, 0) + ( 480080.281, 4764979.500, 0, 0) + ( 480082.969, 4765049.500, 0, 0) + ( 480088.812, 4765139.500, 0, 0) + ( 480059.906, 4765239.500, 0, 0) + ( 480019.719, 4765319.500, 0, 0) + ( 479980.219, 4765409.500, 0, 0) + ( 479909.875, 4765370.000, 0, 0) + ( 479859.875, 4765270.000, 0, 0) + ( 479819.844, 4765180.500, 0, 0) + +Shape:1 (Polygon) nVertices=20, nParts=1 + Bounds:( 479014.938, 4764879.000, 0, 0) + to ( 480039.031, 4765558.500, 0, 0) + ( 480035.344, 4765558.500, 0, 0) Ring + ( 480039.031, 4765539.500, 0, 0) + ( 479730.375, 4765400.500, 0, 0) + ( 479647.000, 4765369.500, 0, 0) + ( 479690.188, 4765259.500, 0, 0) + ( 479819.844, 4765180.500, 0, 0) + ( 479779.844, 4765109.500, 0, 0) + ( 479681.781, 4764940.000, 0, 0) + ( 479468.000, 4764942.500, 0, 0) + ( 479411.438, 4764940.500, 0, 0) + ( 479353.000, 4764939.500, 0, 0) + ( 479208.656, 4764882.500, 0, 0) + ( 479196.812, 4764879.000, 0, 0) + ( 479123.281, 4765015.000, 0, 0) + ( 479046.531, 4765117.000, 0, 0) + ( 479029.719, 4765110.500, 0, 0) + ( 479014.938, 4765147.500, 0, 0) + ( 479149.938, 4765200.500, 0, 0) + ( 479639.625, 4765399.500, 0, 0) + ( 480035.344, 4765558.500, 0, 0) + +Shape:2 (Polygon) nVertices=54, nParts=1 + Bounds:( 480882.688, 4763472.500, 0, 0) + to ( 484519.969, 4765410.000, 0, 0) + ( 481575.000, 4764999.500, 0, 0) Ring + ( 481542.312, 4765097.500, 0, 0) + ( 481443.688, 4765387.500, 0, 0) + ( 481499.656, 4765410.000, 0, 0) + ( 481631.000, 4765031.000, 0, 0) + ( 481693.312, 4764853.000, 0, 0) + ( 481759.281, 4764889.500, 0, 0) + ( 481860.031, 4764920.000, 0, 0) + ( 482002.969, 4764910.000, 0, 0) + ( 482180.094, 4764909.500, 0, 0) + ( 482359.812, 4764960.000, 0, 0) + ( 482510.500, 4765065.000, 0, 0) + ( 482619.906, 4765080.500, 0, 0) + ( 482809.500, 4765090.000, 0, 0) + ( 483189.812, 4765084.500, 0, 0) + ( 483330.312, 4765105.500, 0, 0) + ( 483591.094, 4765260.000, 0, 0) + ( 483700.500, 4765280.000, 0, 0) + ( 483799.938, 4765270.000, 0, 0) + ( 484039.844, 4765280.500, 0, 0) + ( 484115.688, 4765300.000, 0, 0) + ( 484120.625, 4765280.000, 0, 0) + ( 484131.125, 4765260.000, 0, 0) + ( 484167.844, 4765271.000, 0, 0) + ( 484277.875, 4765015.500, 0, 0) + ( 484455.062, 4764500.000, 0, 0) + ( 484519.969, 4764345.000, 0, 0) + ( 484482.031, 4764332.000, 0, 0) + ( 483904.719, 4764113.500, 0, 0) + ( 483334.844, 4763905.000, 0, 0) + ( 482941.031, 4763760.500, 0, 0) + ( 482590.719, 4763624.500, 0, 0) + ( 482185.656, 4763472.500, 0, 0) + ( 482009.844, 4763980.500, 0, 0) + ( 481960.438, 4764099.500, 0, 0) + ( 481767.500, 4764014.500, 0, 0) + ( 480955.500, 4763700.000, 0, 0) + ( 480882.688, 4763670.000, 0, 0) + ( 481039.938, 4763889.500, 0, 0) + ( 481130.312, 4763979.500, 0, 0) + ( 481143.438, 4764010.500, 0, 0) + ( 481199.844, 4764180.000, 0, 0) + ( 481141.625, 4764480.500, 0, 0) + ( 481140.469, 4764510.500, 0, 0) + ( 481159.938, 4764580.000, 0, 0) + ( 481185.500, 4764607.000, 0, 0) + ( 481199.219, 4764623.500, 0, 0) + ( 481209.812, 4764633.500, 0, 0) + ( 481235.312, 4764650.000, 0, 0) + ( 481635.969, 4764795.500, 0, 0) + ( 481645.312, 4764797.500, 0, 0) + ( 481629.844, 4764829.500, 0, 0) + ( 481602.125, 4764915.500, 0, 0) + ( 481575.000, 4764999.500, 0, 0) + +Shape:3 (Polygon) nVertices=29, nParts=1 + Bounds:( 479117.812, 4764505.000, 0, 0) + to ( 480088.812, 4765409.500, 0, 0) + ( 479819.844, 4765180.500, 0, 0) Ring + ( 479859.875, 4765270.000, 0, 0) + ( 479909.875, 4765370.000, 0, 0) + ( 479980.219, 4765409.500, 0, 0) + ( 480019.719, 4765319.500, 0, 0) + ( 480059.906, 4765239.500, 0, 0) + ( 480088.812, 4765139.500, 0, 0) + ( 480082.969, 4765049.500, 0, 0) + ( 480000.281, 4765043.000, 0, 0) + ( 479934.969, 4765020.000, 0, 0) + ( 479895.125, 4765000.000, 0, 0) + ( 479734.375, 4764865.000, 0, 0) + ( 479680.281, 4764852.000, 0, 0) + ( 479644.781, 4764827.500, 0, 0) + ( 479637.875, 4764803.000, 0, 0) + ( 479617.219, 4764760.000, 0, 0) + ( 479587.281, 4764718.000, 0, 0) + ( 479548.031, 4764693.500, 0, 0) + ( 479504.906, 4764609.500, 0, 0) + ( 479239.812, 4764505.000, 0, 0) + ( 479117.812, 4764847.000, 0, 0) + ( 479196.812, 4764879.000, 0, 0) + ( 479208.656, 4764882.500, 0, 0) + ( 479353.000, 4764939.500, 0, 0) + ( 479411.438, 4764940.500, 0, 0) + ( 479468.000, 4764942.500, 0, 0) + ( 479681.781, 4764940.000, 0, 0) + ( 479779.844, 4765109.500, 0, 0) + ( 479819.844, 4765180.500, 0, 0) + +Shape:4 (Polygon) nVertices=22, nParts=1 + Bounds:( 480537.156, 4764738.000, 0, 0) + to ( 481575.000, 4765387.500, 0, 0) + ( 480537.156, 4765014.000, 0, 0) Ring + ( 481090.281, 4765242.000, 0, 0) + ( 481443.688, 4765387.500, 0, 0) + ( 481542.312, 4765097.500, 0, 0) + ( 481575.000, 4764999.500, 0, 0) + ( 481538.906, 4764982.500, 0, 0) + ( 481509.656, 4764967.000, 0, 0) + ( 481457.375, 4764937.000, 0, 0) + ( 481465.906, 4764872.500, 0, 0) + ( 481291.094, 4764810.000, 0, 0) + ( 481281.312, 4764876.500, 0, 0) + ( 481136.844, 4764994.500, 0, 0) + ( 481088.188, 4764936.000, 0, 0) + ( 480984.250, 4764875.000, 0, 0) + ( 480930.719, 4764852.000, 0, 0) + ( 480922.031, 4764850.500, 0, 0) + ( 480824.969, 4764820.000, 0, 0) + ( 480761.469, 4764778.000, 0, 0) + ( 480701.062, 4764738.000, 0, 0) + ( 480605.000, 4764835.000, 0, 0) + ( 480567.969, 4764918.000, 0, 0) + ( 480537.156, 4765014.000, 0, 0) + +Shape:5 (Polygon) nVertices=60, nParts=1 + Bounds:( 484482.031, 4760649.500, 0, 0) + to ( 488408.281, 4765179.000, 0, 0) + ( 484482.031, 4764332.000, 0, 0) Ring + ( 484519.969, 4764345.000, 0, 0) + ( 484817.938, 4764465.500, 0, 0) + ( 485615.406, 4764770.000, 0, 0) + ( 486269.688, 4765010.000, 0, 0) + ( 486320.062, 4765024.000, 0, 0) + ( 486340.594, 4765040.000, 0, 0) + ( 486369.844, 4765050.000, 0, 0) + ( 486719.969, 4765170.000, 0, 0) + ( 486738.625, 4765179.000, 0, 0) + ( 486987.781, 4764497.500, 0, 0) + ( 487019.875, 4764384.500, 0, 0) + ( 487077.375, 4764226.500, 0, 0) + ( 487120.031, 4764100.000, 0, 0) + ( 487160.250, 4763998.000, 0, 0) + ( 487186.812, 4763922.500, 0, 0) + ( 487408.250, 4763315.500, 0, 0) + ( 487608.062, 4762780.000, 0, 0) + ( 487659.406, 4762650.000, 0, 0) + ( 487719.406, 4762480.000, 0, 0) + ( 487741.062, 4762419.500, 0, 0) + ( 487747.875, 4762395.500, 0, 0) + ( 487880.875, 4762032.000, 0, 0) + ( 487899.438, 4761975.500, 0, 0) + ( 488082.000, 4761480.000, 0, 0) + ( 488408.281, 4760649.500, 0, 0) + ( 488050.375, 4760824.500, 0, 0) + ( 487690.906, 4760802.000, 0, 0) + ( 487640.062, 4760879.500, 0, 0) + ( 487594.938, 4761023.000, 0, 0) + ( 487341.375, 4761776.500, 0, 0) + ( 487037.125, 4761672.500, 0, 0) + ( 487005.375, 4761662.500, 0, 0) + ( 486788.219, 4761579.500, 0, 0) + ( 486822.250, 4761492.000, 0, 0) + ( 486838.312, 4761437.500, 0, 0) + ( 486841.312, 4761381.000, 0, 0) + ( 486850.562, 4761340.000, 0, 0) + ( 486810.750, 4761335.500, 0, 0) + ( 486775.438, 4761400.000, 0, 0) + ( 486710.094, 4761368.000, 0, 0) + ( 486606.188, 4761330.000, 0, 0) + ( 486548.656, 4761488.000, 0, 0) + ( 486380.656, 4761428.500, 0, 0) + ( 486152.906, 4761348.000, 0, 0) + ( 485900.250, 4761250.500, 0, 0) + ( 485666.875, 4761156.500, 0, 0) + ( 485585.875, 4761374.500, 0, 0) + ( 485564.875, 4761444.500, 0, 0) + ( 485496.219, 4761614.500, 0, 0) + ( 485438.688, 4761760.500, 0, 0) + ( 485264.969, 4762222.500, 0, 0) + ( 485192.688, 4762439.000, 0, 0) + ( 485175.406, 4762493.500, 0, 0) + ( 484947.344, 4763100.500, 0, 0) + ( 484888.000, 4763260.500, 0, 0) + ( 484785.469, 4763560.500, 0, 0) + ( 484760.219, 4763659.500, 0, 0) + ( 484696.969, 4763734.000, 0, 0) + ( 484482.031, 4764332.000, 0, 0) + +Shape:6 (Polygon) nVertices=26, nParts=1 + Bounds:( 478315.531, 4764174.000, 0, 0) + to ( 479305.875, 4765147.500, 0, 0) + ( 479014.938, 4765147.500, 0, 0) Ring + ( 479029.719, 4765110.500, 0, 0) + ( 479117.812, 4764847.000, 0, 0) + ( 479239.812, 4764505.000, 0, 0) + ( 479305.875, 4764361.000, 0, 0) + ( 479256.031, 4764314.500, 0, 0) + ( 479220.906, 4764212.500, 0, 0) + ( 479114.500, 4764174.000, 0, 0) + ( 479018.281, 4764418.500, 0, 0) + ( 478896.938, 4764371.000, 0, 0) + ( 478748.812, 4764308.500, 0, 0) + ( 478503.031, 4764218.000, 0, 0) + ( 478461.750, 4764337.500, 0, 0) + ( 478443.938, 4764400.500, 0, 0) + ( 478447.812, 4764454.000, 0, 0) + ( 478448.688, 4764531.500, 0, 0) + ( 478502.188, 4764541.500, 0, 0) + ( 478683.000, 4764730.500, 0, 0) + ( 478621.031, 4764788.500, 0, 0) + ( 478597.344, 4764766.500, 0, 0) + ( 478532.500, 4764695.500, 0, 0) + ( 478460.125, 4764615.000, 0, 0) + ( 478408.062, 4764654.000, 0, 0) + ( 478315.531, 4764876.000, 0, 0) + ( 478889.250, 4765100.000, 0, 0) + ( 479014.938, 4765147.500, 0, 0) + +Shape:7 (Polygon) nVertices=6, nParts=1 + Bounds:( 479029.719, 4764847.000, 0, 0) + to ( 479196.812, 4765117.000, 0, 0) + ( 479029.719, 4765110.500, 0, 0) Ring + ( 479046.531, 4765117.000, 0, 0) + ( 479123.281, 4765015.000, 0, 0) + ( 479196.812, 4764879.000, 0, 0) + ( 479117.812, 4764847.000, 0, 0) + ( 479029.719, 4765110.500, 0, 0) + +Shape:8 (Polygon) nVertices=20, nParts=1 + Bounds:( 479504.906, 4764609.500, 0, 0) + to ( 480133.969, 4765049.500, 0, 0) + ( 480082.969, 4765049.500, 0, 0) Ring + ( 480080.281, 4764979.500, 0, 0) + ( 480133.969, 4764856.500, 0, 0) + ( 479968.469, 4764788.000, 0, 0) + ( 479750.688, 4764702.000, 0, 0) + ( 479735.906, 4764752.000, 0, 0) + ( 479640.094, 4764721.000, 0, 0) + ( 479658.594, 4764670.000, 0, 0) + ( 479504.906, 4764609.500, 0, 0) + ( 479548.031, 4764693.500, 0, 0) + ( 479587.281, 4764718.000, 0, 0) + ( 479617.219, 4764760.000, 0, 0) + ( 479637.875, 4764803.000, 0, 0) + ( 479644.781, 4764827.500, 0, 0) + ( 479680.281, 4764852.000, 0, 0) + ( 479734.375, 4764865.000, 0, 0) + ( 479895.125, 4765000.000, 0, 0) + ( 479934.969, 4765020.000, 0, 0) + ( 480000.281, 4765043.000, 0, 0) + ( 480082.969, 4765049.500, 0, 0) + +Shape:9 (Polygon) nVertices=31, nParts=1 + Bounds:( 479968.469, 4764183.000, 0, 0) + to ( 480731.656, 4765014.000, 0, 0) + ( 480389.688, 4764950.000, 0, 0) Ring + ( 480537.156, 4765014.000, 0, 0) + ( 480567.969, 4764918.000, 0, 0) + ( 480605.000, 4764835.000, 0, 0) + ( 480701.062, 4764738.000, 0, 0) + ( 480710.250, 4764690.500, 0, 0) + ( 480588.594, 4764740.500, 0, 0) + ( 480540.719, 4764741.000, 0, 0) + ( 480515.125, 4764695.000, 0, 0) + ( 480731.656, 4764561.500, 0, 0) + ( 480692.188, 4764453.500, 0, 0) + ( 480677.844, 4764439.000, 0, 0) + ( 480655.344, 4764397.500, 0, 0) + ( 480584.375, 4764353.000, 0, 0) + ( 480500.406, 4764326.500, 0, 0) + ( 480358.531, 4764277.000, 0, 0) + ( 480192.312, 4764183.000, 0, 0) + ( 480157.125, 4764266.500, 0, 0) + ( 480234.312, 4764304.000, 0, 0) + ( 480289.125, 4764348.500, 0, 0) + ( 480316.000, 4764395.000, 0, 0) + ( 480343.562, 4764477.000, 0, 0) + ( 480343.719, 4764532.500, 0, 0) + ( 480258.031, 4764767.000, 0, 0) + ( 480177.156, 4764742.000, 0, 0) + ( 480093.750, 4764703.000, 0, 0) + ( 480011.000, 4764674.500, 0, 0) + ( 479985.062, 4764732.000, 0, 0) + ( 479968.469, 4764788.000, 0, 0) + ( 480133.969, 4764856.500, 0, 0) + ( 480389.688, 4764950.000, 0, 0) + +Shape:10 (Polygon) nVertices=61, nParts=1 + Bounds:( 479492.688, 4762880.500, 0, 0) + to ( 481645.312, 4764999.500, 0, 0) + ( 480701.062, 4764738.000, 0, 0) Ring + ( 480761.469, 4764778.000, 0, 0) + ( 480824.969, 4764820.000, 0, 0) + ( 480922.031, 4764850.500, 0, 0) + ( 480930.719, 4764852.000, 0, 0) + ( 480984.250, 4764875.000, 0, 0) + ( 481088.188, 4764936.000, 0, 0) + ( 481136.844, 4764994.500, 0, 0) + ( 481281.312, 4764876.500, 0, 0) + ( 481291.094, 4764810.000, 0, 0) + ( 481465.906, 4764872.500, 0, 0) + ( 481457.375, 4764937.000, 0, 0) + ( 481509.656, 4764967.000, 0, 0) + ( 481538.906, 4764982.500, 0, 0) + ( 481575.000, 4764999.500, 0, 0) + ( 481602.125, 4764915.500, 0, 0) + ( 481629.844, 4764829.500, 0, 0) + ( 481645.312, 4764797.500, 0, 0) + ( 481635.969, 4764795.500, 0, 0) + ( 481235.312, 4764650.000, 0, 0) + ( 481209.812, 4764633.500, 0, 0) + ( 481199.219, 4764623.500, 0, 0) + ( 481185.500, 4764607.000, 0, 0) + ( 481159.938, 4764580.000, 0, 0) + ( 481140.469, 4764510.500, 0, 0) + ( 481141.625, 4764480.500, 0, 0) + ( 481199.844, 4764180.000, 0, 0) + ( 481143.438, 4764010.500, 0, 0) + ( 481130.312, 4763979.500, 0, 0) + ( 481039.938, 4763889.500, 0, 0) + ( 480882.688, 4763670.000, 0, 0) + ( 480826.062, 4763650.500, 0, 0) + ( 480745.188, 4763628.500, 0, 0) + ( 480654.438, 4763627.500, 0, 0) + ( 480599.812, 4763660.000, 0, 0) + ( 480281.938, 4763576.500, 0, 0) + ( 480221.500, 4763533.500, 0, 0) + ( 480199.688, 4763509.000, 0, 0) + ( 480195.094, 4763430.000, 0, 0) + ( 480273.688, 4763305.500, 0, 0) + ( 480309.688, 4763063.500, 0, 0) + ( 480201.844, 4762962.500, 0, 0) + ( 479855.312, 4762880.500, 0, 0) + ( 479848.531, 4762897.000, 0, 0) + ( 479728.875, 4763217.500, 0, 0) + ( 479492.688, 4763850.000, 0, 0) + ( 479550.062, 4763919.500, 0, 0) + ( 480120.219, 4764188.500, 0, 0) + ( 480192.312, 4764183.000, 0, 0) + ( 480358.531, 4764277.000, 0, 0) + ( 480500.406, 4764326.500, 0, 0) + ( 480584.375, 4764353.000, 0, 0) + ( 480655.344, 4764397.500, 0, 0) + ( 480677.844, 4764439.000, 0, 0) + ( 480692.188, 4764453.500, 0, 0) + ( 480731.656, 4764561.500, 0, 0) + ( 480515.125, 4764695.000, 0, 0) + ( 480540.719, 4764741.000, 0, 0) + ( 480588.594, 4764740.500, 0, 0) + ( 480710.250, 4764690.500, 0, 0) + ( 480701.062, 4764738.000, 0, 0) + +Shape:11 (Polygon) nVertices=21, nParts=1 + Bounds:( 476732.906, 4763624.500, 0, 0) + to ( 478408.062, 4764876.000, 0, 0) + ( 478315.531, 4764876.000, 0, 0) Ring + ( 478408.062, 4764654.000, 0, 0) + ( 478325.250, 4764606.500, 0, 0) + ( 478220.094, 4764574.500, 0, 0) + ( 478140.344, 4764511.000, 0, 0) + ( 478065.062, 4764487.500, 0, 0) + ( 478080.938, 4764401.500, 0, 0) + ( 478110.500, 4764308.500, 0, 0) + ( 478149.969, 4764212.500, 0, 0) + ( 478180.219, 4764150.000, 0, 0) + ( 478192.500, 4764099.500, 0, 0) + ( 477893.125, 4763984.500, 0, 0) + ( 477417.031, 4763800.500, 0, 0) + ( 477005.594, 4763640.000, 0, 0) + ( 476958.312, 4763624.500, 0, 0) + ( 476947.250, 4763664.500, 0, 0) + ( 476732.906, 4764243.000, 0, 0) + ( 477322.375, 4764502.000, 0, 0) + ( 477599.906, 4764600.000, 0, 0) + ( 477949.656, 4764745.000, 0, 0) + ( 478315.531, 4764876.000, 0, 0) + +Shape:12 (Polygon) nVertices=22, nParts=1 + Bounds:( 478065.062, 4764099.500, 0, 0) + to ( 478683.000, 4764788.500, 0, 0) + ( 478408.062, 4764654.000, 0, 0) Ring + ( 478460.125, 4764615.000, 0, 0) + ( 478532.500, 4764695.500, 0, 0) + ( 478597.344, 4764766.500, 0, 0) + ( 478621.031, 4764788.500, 0, 0) + ( 478683.000, 4764730.500, 0, 0) + ( 478502.188, 4764541.500, 0, 0) + ( 478448.688, 4764531.500, 0, 0) + ( 478447.812, 4764454.000, 0, 0) + ( 478443.938, 4764400.500, 0, 0) + ( 478461.750, 4764337.500, 0, 0) + ( 478503.031, 4764218.000, 0, 0) + ( 478192.500, 4764099.500, 0, 0) + ( 478180.219, 4764150.000, 0, 0) + ( 478149.969, 4764212.500, 0, 0) + ( 478110.500, 4764308.500, 0, 0) + ( 478080.938, 4764401.500, 0, 0) + ( 478065.062, 4764487.500, 0, 0) + ( 478140.344, 4764511.000, 0, 0) + ( 478220.094, 4764574.500, 0, 0) + ( 478325.250, 4764606.500, 0, 0) + ( 478408.062, 4764654.000, 0, 0) + +Shape:13 (Polygon) nVertices=27, nParts=1 + Bounds:( 479239.812, 4763850.000, 0, 0) + to ( 480343.719, 4764788.000, 0, 0) + ( 479750.688, 4764702.000, 0, 0) Ring + ( 479968.469, 4764788.000, 0, 0) + ( 479985.062, 4764732.000, 0, 0) + ( 480011.000, 4764674.500, 0, 0) + ( 480093.750, 4764703.000, 0, 0) + ( 480177.156, 4764742.000, 0, 0) + ( 480258.031, 4764767.000, 0, 0) + ( 480343.719, 4764532.500, 0, 0) + ( 480343.562, 4764477.000, 0, 0) + ( 480316.000, 4764395.000, 0, 0) + ( 480289.125, 4764348.500, 0, 0) + ( 480234.312, 4764304.000, 0, 0) + ( 480157.125, 4764266.500, 0, 0) + ( 480192.312, 4764183.000, 0, 0) + ( 480120.219, 4764188.500, 0, 0) + ( 479550.062, 4763919.500, 0, 0) + ( 479492.688, 4763850.000, 0, 0) + ( 479487.750, 4763864.500, 0, 0) + ( 479442.750, 4763990.000, 0, 0) + ( 479436.000, 4764023.000, 0, 0) + ( 479398.938, 4764100.000, 0, 0) + ( 479349.625, 4764230.000, 0, 0) + ( 479305.875, 4764361.000, 0, 0) + ( 479239.812, 4764505.000, 0, 0) + ( 479504.906, 4764609.500, 0, 0) + ( 479658.594, 4764670.000, 0, 0) + ( 479750.688, 4764702.000, 0, 0) + +Shape:14 (Polygon) nVertices=5, nParts=1 + Bounds:( 479640.094, 4764670.000, 0, 0) + to ( 479750.688, 4764752.000, 0, 0) + ( 479750.688, 4764702.000, 0, 0) Ring + ( 479658.594, 4764670.000, 0, 0) + ( 479640.094, 4764721.000, 0, 0) + ( 479735.906, 4764752.000, 0, 0) + ( 479750.688, 4764702.000, 0, 0) + +Shape:15 (Polygon) nVertices=28, nParts=1 + Bounds:( 478503.031, 4763357.500, 0, 0) + to ( 479349.625, 4764418.500, 0, 0) + ( 479305.875, 4764361.000, 0, 0) Ring + ( 479349.625, 4764230.000, 0, 0) + ( 479218.156, 4764126.000, 0, 0) + ( 479128.344, 4764030.500, 0, 0) + ( 479103.406, 4764000.000, 0, 0) + ( 479099.594, 4763977.500, 0, 0) + ( 479080.812, 4763930.000, 0, 0) + ( 478999.812, 4763864.500, 0, 0) +------------------------------------------------------------------------- +Test 4: dump pline.dbf - uses new F field type +------------------------------------------------------------------------- +Field 0: Type=Integer, Title=`FNODE_', Width=11, Decimals=0 +Field 1: Type=Integer, Title=`TNODE_', Width=11, Decimals=0 +Field 2: Type=Integer, Title=`LPOLY_', Width=11, Decimals=0 +Field 3: Type=Integer, Title=`RPOLY_', Width=11, Decimals=0 +Field 4: Type=Double, Title=`LENGTH', Width=13, Decimals=3 +Field 5: Type=Integer, Title=`PLINE_', Width=11, Decimals=0 +Field 6: Type=Integer, Title=`PLINE_ID', Width=11, Decimals=0 +Field 7: Type=Integer, Title=`UID', Width=11, Decimals=0 +Field 8: Type=Integer, Title=`GISO_TYPE_', Width=11, Decimals=0 +Field 9: Type=Integer, Title=`SYMBOL', Width=6, Decimals=0 +Field 10: Type=Integer, Title=`LOCK__ID', Width=11, Decimals=0 +Field 11: Type=Integer, Title=`PHASE__ID', Width=6, Decimals=0 +Field 12: Type=Integer, Title=`OBJECT__ID', Width=11, Decimals=0 +Field 13: Type=String, Title=`TYPE', Width=50, Decimals=0 +Field 14: Type=Integer, Title=`SYM_NBR', Width=6, Decimals=0 +Field 15: Type=String, Title=`PHASE', Width=4, Decimals=0 +Field 16: Type=String, Title=`CKT_NM', Width=30, Decimals=0 +Field 17: Type=String, Title=`VOLTAGE', Width=30, Decimals=0 +Field 18: Type=String, Title=`CMPN', Width=30, Decimals=0 + +Record: 0 +FNODE_: 351 +TNODE_: 352 +LPOLY_: 0 +RPOLY_: 0 +LENGTH: 139.451 +PLINE_: 1 +PLINE_ID: 8588 +UID: 544484 +GISO_TYPE_: 13 +SYMBOL: 101 +LOCK__ID: 0 +PHASE__ID: 0 +OBJECT__ID: 131978 +TYPE: Overhead Primary +SYM_NBR: 101 +PHASE: ABC +CKT_NM: MED36 +VOLTAGE: (NULL) +CMPN: (NULL) + +Record: 1 +FNODE_: 352 +TNODE_: 362 +LPOLY_: 0 +RPOLY_: 0 +LENGTH: 158.033 +PLINE_: 2 +PLINE_ID: 8695 +UID: 544591 +------------------------------------------------------------------------- +Test 5: NULL Shapes. +------------------------------------------------------------------------- +Shapefile Type: Arc # of Shapes: 124 + +File Bounds: ( 257104.880, 5176098.606,0,0) + to ( 335497.500, 5226768.100,0,0) + +Shape:0 (Arc) nVertices=21, nParts=1 + Bounds:( 317138.450, 5176398.916, 0, 0) + to ( 317325.590, 5186063.780, 0, 0) + ( 317255.906, 5176398.916, 0, 0) Ring + ( 317188.010, 5176506.460, 0, 0) + ( 317176.920, 5176524.510, 0, 0) + ( 317165.340, 5176546.850, 0, 0) + ( 317157.950, 5176566.020, 0, 0) + ( 317150.020, 5176587.650, 0, 0) + ( 317140.130, 5176623.380, 0, 0) + ( 317138.700, 5176637.220, 0, 0) + ( 317138.450, 5176652.790, 0, 0) + ( 317194.710, 5177654.350, 0, 0) + ( 317208.900, 5178001.150, 0, 0) + ( 317257.240, 5178791.400, 0, 0) + ( 317233.330, 5179171.730, 0, 0) + ( 317178.860, 5179593.910, 0, 0) + ( 317177.430, 5180161.330, 0, 0) + ( 317179.910, 5181231.060, 0, 0) + ( 317191.120, 5182009.000, 0, 0) + ( 317217.150, 5182812.160, 0, 0) + ( 317251.760, 5184426.350, 0, 0) + ( 317285.550, 5185242.720, 0, 0) + ( 317325.590, 5186063.780, 0, 0) + +Shape:1 (Arc) nVertices=14, nParts=1 + Bounds:( 327417.340, 5176119.960, 0, 0) + to ( 327575.150, 5179522.550, 0, 0) + ( 327417.340, 5176119.960, 0, 0) Ring + ( 327472.250, 5177756.610, 0, 0) + ( 327475.670, 5178507.280, 0, 0) + ( 327487.420, 5179001.910, 0, 0) + ( 327488.760, 5179080.090, 0, 0) + ( 327485.310, 5179309.310, 0, 0) + ( 327487.010, 5179328.210, 0, 0) + ( 327491.800, 5179348.860, 0, 0) + ( 327499.800, 5179374.940, 0, 0) + ( 327512.980, 5179413.100, 0, 0) + ( 327527.290, 5179446.960, 0, 0) + ( 327538.870, 5179469.890, 0, 0) + ( 327552.260, 5179491.550, 0, 0) + ( 327575.150, 5179522.550, 0, 0) + +Shape:2 (Arc) nVertices=40, nParts=1 + Bounds:( 326935.880, 5180924.980, 0, 0) + to ( 327723.190, 5198803.660, 0, 0) + ( 327370.950, 5180924.980, 0, 0) Ring + ( 327410.070, 5181060.540, 0, 0) + ( 327512.850, 5181435.450, 0, 0) + ( 327518.640, 5181464.010, 0, 0) + ( 327523.700, 5181488.920, 0, 0) + ( 327524.500, 5181514.570, 0, 0) + ( 327468.010, 5182633.640, 0, 0) + ( 327500.040, 5183199.840, 0, 0) + ( 327499.600, 5183224.920, 0, 0) + ( 327484.700, 5183355.010, 0, 0) + ( 327483.690, 5183400.900, 0, 0) + ( 327483.840, 5183464.480, 0, 0) + ( 327486.010, 5183494.980, 0, 0) + ( 327571.280, 5184207.820, 0, 0) + ( 327617.210, 5184599.430, 0, 0) + ( 327620.420, 5184623.780, 0, 0) + ( 327625.530, 5184650.530, 0, 0) + ( 327698.430, 5184927.070, 0, 0) + ( 327702.100, 5184946.520, 0, 0) + ( 327717.940, 5185394.820, 0, 0) + ( 327723.190, 5185719.320, 0, 0) + ( 327719.460, 5185737.170, 0, 0) + ( 327712.090, 5185755.740, 0, 0) + ( 327699.840, 5185775.080, 0, 0) + ( 327683.830, 5185791.480, 0, 0) + ( 327665.380, 5185807.950, 0, 0) + ( 327641.970, 5185822.740, 0, 0) + ( 327622.280, 5185829.070, 0, 0) + ( 327604.950, 5185832.940, 0, 0) + ( 326937.500, 5185829.310, 0, 0) + ( 326935.880, 5187515.510, 0, 0) + ( 326983.050, 5189115.230, 0, 0) + ( 326998.860, 5189920.820, 0, 0) + ( 327060.240, 5190715.870, 0, 0) + ( 327123.230, 5192332.220, 0, 0) + ( 327179.920, 5193766.290, 0, 0) + ( 327185.490, 5193921.940, 0, 0) + ( 327204.120, 5195553.580, 0, 0) + ( 327218.270, 5197179.250, 0, 0) + ( 327251.330, 5198803.660, 0, 0) + +Shape:3 (NullShape) nVertices=0, nParts=0 + Bounds:( 0.000, 0.000, 0, 0) + to ( 0.000, 0.000, 0, 0) + +Shape:4 (NullShape) nVertices=0, nParts=0 + Bounds:( 0.000, 0.000, 0, 0) + to ( 0.000, 0.000, 0, 0) + +Shape:5 (NullShape) nVertices=0, nParts=0 + Bounds:( 0.000, 0.000, 0, 0) + to ( 0.000, 0.000, 0, 0) + +Shape:6 (Arc) nVertices=2, nParts=1 + Bounds:( 327123.230, 5192296.600, 0, 0) + to ( 328480.850, 5192332.220, 0, 0) + ( 327123.230, 5192332.220, 0, 0) Ring + ( 328480.850, 5192296.600, 0, 0) + +Shape:7 (Arc) nVertices=5, nParts=1 + Bounds:( 329222.060, 5217943.490, 0, 0) + to ( 335290.680, 5218084.780, 0, 0) + ( 329222.060, 5218084.780, 0, 0) Ring + ( 330442.520, 5218057.650, 0, 0) + ( 332059.960, 5218033.810, 0, 0) + ( 333685.820, 5218004.860, 0, 0) + ( 335290.680, 5217943.490, 0, 0) + +Shape:8 (Arc) nVertices=65, nParts=1 + Bounds:( 280048.100, 5177687.643, 0, 0) + to ( 280439.410, 5182567.120, 0, 0) + ( 280316.840, 5177687.643, 0, 0) Ring + ( 280325.310, 5177968.830, 0, 0) + ( 280324.630, 5178037.940, 0, 0) + ( 280324.150, 5178059.350, 0, 0) + ( 280320.130, 5178084.560, 0, 0) + ( 280299.860, 5178170.250, 0, 0) + ( 280288.710, 5178218.940, 0, 0) + ( 280274.280, 5178283.640, 0, 0) + ( 280268.000, 5178330.870, 0, 0) + ( 280267.910, 5178346.760, 0, 0) + ( 280270.510, 5178364.580, 0, 0) + ( 280274.820, 5178382.360, 0, 0) + ( 280278.440, 5178397.210, 0, 0) + ( 280351.400, 5178743.800, 0, 0) + ( 280369.860, 5178800.630, 0, 0) + ( 280378.670, 5178826.010, 0, 0) + ( 280400.350, 5178869.890, 0, 0) + ( 280414.870, 5178901.180, 0, 0) + ( 280427.030, 5178934.990, 0, 0) + ( 280436.250, 5178971.970, 0, 0) + ( 280439.410, 5178992.650, 0, 0) + ( 280439.170, 5179001.630, 0, 0) + ( 280437.010, 5179011.690, 0, 0) + ( 280434.930, 5179016.970, 0, 0) + ( 280431.870, 5179022.260, 0, 0) + ( 280413.610, 5179041.850, 0, 0) + ( 280410.040, 5179046.780, 0, 0) + ( 280406.640, 5179052.480, 0, 0) diff --git a/support/ShapeLib/tests/test1.sh b/support/ShapeLib/tests/test1.sh new file mode 100644 index 00000000..86ce9864 --- /dev/null +++ b/support/ShapeLib/tests/test1.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +EG_DATA=/u/www/projects/shapelib/eg_data + +testdir="$(dirname "$(readlink -f $0)")" + +( +cd "$top_builddir" +echo ------------------------------------------------------------------------- +echo Test 1: dump anno.shp +echo ------------------------------------------------------------------------- +./shpdump $EG_DATA/anno.shp | head -250 + +echo ------------------------------------------------------------------------- +echo Test 2: dump brklinz.shp +echo ------------------------------------------------------------------------- +./shpdump $EG_DATA/brklinz.shp | head -500 + +echo ------------------------------------------------------------------------- +echo Test 3: dump polygon.shp +echo ------------------------------------------------------------------------- +./shpdump $EG_DATA/polygon.shp | head -500 + +echo ------------------------------------------------------------------------- +echo Test 4: dump pline.dbf - uses new F field type +echo ------------------------------------------------------------------------- +./dbfdump -m -h $EG_DATA/pline.dbf | head -50 + +echo ------------------------------------------------------------------------- +echo Test 5: NULL Shapes. +echo ------------------------------------------------------------------------- +./shpdump $EG_DATA/csah.dbf | head -150 +) > "$testdir/s1.out" + +result="$(diff "$testdir/s1.out" "$testdir/stream1.out")" +if [ "$result" == "" ]; then + echo "******* Stream 1 Succeeded *********" + rm "$testdir/s1.out" + exit 0 +else + echo "******* Stream 1 Failed *********" + echo "$result" + rm "$testdir/s1.out" + exit 1 +fi diff --git a/support/ShapeLib/tests/test2.sh b/support/ShapeLib/tests/test2.sh new file mode 100644 index 00000000..266fe54c --- /dev/null +++ b/support/ShapeLib/tests/test2.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +testdir="$(dirname "$(readlink -f $0)")" + +( +cd "$top_builddir" +for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13; do + echo ----------------------------------------------------------------------- + echo Test 2/$i + echo ----------------------------------------------------------------------- + + ./shptest $i + ./shpdump test${i}.shp +done +) > "$testdir/s2.out" + +result="$(diff "$testdir/s2.out" "$testdir/stream2.out")" +if [ "$result" == "" ]; then + echo "******* Stream 2 Succeeded *********" + rm "$testdir/s2.out" + exit 0 +else + echo "******* Stream 2 Failed *********" + echo "$result" + rm "$testdir/s2.out" + exit 1 +fi diff --git a/support/ShapeLib/tests/test3.sh b/support/ShapeLib/tests/test3.sh new file mode 100644 index 00000000..900e2186 --- /dev/null +++ b/support/ShapeLib/tests/test3.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# +# Use example programs to create a very simple dataset that +# should display in ARCView II. +# + +testdir="$(dirname "$(readlink -f $0)")" + +( +cd "$top_builddir" +./shpcreate test polygon +./dbfcreate test.dbf -s Description 30 -n TestInt 6 0 -n TestDouble 16 5 + +./shpadd test 0 0 100 0 100 100 0 100 0 0 + 20 20 20 30 30 30 20 20 +./dbfadd test.dbf "Square with triangle missing" 1.4 2.5 + +./shpadd test 150 150 160 150 180 170 150 150 +./dbfadd test.dbf "Smaller triangle" 100 1000.25 + +./shpadd test 150 150 160 150 180 170 150 150 +./dbfadd test.dbf "" "" "" + +./shpdump test.shp +./dbfdump test.dbf +) > "$testdir/s3.out" + +result=$(diff "$testdir/s3.out" "$testdir/stream3.out") +if [ "$result" == "" ]; then + echo "******* Stream 3 Succeeded *********" + rm "$testdir/s3.out" + exit 0 +else + echo "******* Stream 3 Failed *********" + echo "$result" + rm "$testdir/s3.out" + exit 1 +fi diff --git a/support/ShapeLib/web/codepage.html b/support/ShapeLib/web/codepage.html new file mode 100644 index 00000000..23a9cfb3 --- /dev/null +++ b/support/ShapeLib/web/codepage.html @@ -0,0 +1,403 @@ + +This table is derived from:

+ +http://www.autopark.ru/ASBProgrammerGuide/DBFSTRUC.HTM

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDCodepageDescription
10x01437US MS-DOS
20x02850International MS-DOS
30x031252Windows ANSI Latin I
40x0410000Standard Macintosh
80x08865Danish OEM
90x09437Dutch OEM
100x0A850Dutch OEM*
110x0B437Finnish OEM
130x0D437French OEM
140x0E850French OEM*
150x0F437German OEM
160x10850German OEM*
170x11437Italian OEM
180x12850Italian OEM*
190x13932Japanese Shift-JIS
200x14850Spanish OEM*
210x15437Swedish OEM
220x16850Swedish OEM*
230x17865Norwegian OEM
240x18437Spanish OEM
250x19437English OEM (Great Britain)
260x1A850English OEM (Great Britain)*
270x1B437English OEM (US)
280x1C863French OEM (Canada)
290x1D850French OEM*
310x1F852Czech OEM
340x22852Hungarian OEM
350x23852Polish OEM
360x24860Portuguese OEM
370x25850Portuguese OEM*
380x26866Russian OEM
550x37850English OEM (US)*
640x40852Romanian OEM
770x4D936Chinese GBK (PRC)
780x4E949Korean (ANSI/OEM)
790x4F950Chinese Big5 (Taiwan)
800x50874Thai (ANSI/OEM)
870x57Current ANSI CPANSI
880x581252Western European ANSI
890x591252Spanish ANSI
1000x64852Eastern European MS-DOS
1010x65866Russian MS-DOS
1020x66865Nordic MS-DOS
1030x67861Icelandic MS-DOS
1040x68895Kamenicky (Czech) MS-DOS
1050x69620Mazovia (Polish) MS-DOS
1060x6A737Greek MS-DOS (437G)
1070x6B857Turkish MS-DOS
1080x6C863French-Canadian MS-DOS
1200x78950Taiwan Big 5
1210x79949Hangul (Wansung)
1220x7A936PRC GBK
1230x7B932Japanese Shift-JIS
1240x7C874Thai Windows/MS–DOS
1340x86737Greek OEM
1350x87852Slovenian OEM
1360x88857Turkish OEM
1500x9610007Russian Macintosh
1510x9710029Eastern European Macintosh
1520x9810006Greek Macintosh
2000xC81250Eastern European Windows
2010xC91251Russian Windows
2020xCA1254Turkish Windows
2030xCB1253Greek Windows
2040xCC1257Baltic Windows
diff --git a/support/ShapeLib/web/dbf_api.html b/support/ShapeLib/web/dbf_api.html new file mode 100644 index 00000000..0bd0da1b --- /dev/null +++ b/support/ShapeLib/web/dbf_api.html @@ -0,0 +1,434 @@ + + +Attribute (.DBF) API + + +

Attribute (.DBF) API

+ +The Attribute (DBF) API uses DBFHandle to represent a handle for access +to one .dbf file. The contents of the DBFHandle are visible (see shapefil.h) +but should be ignored by the application. It is intended that all information +be accessed by API functions. Note that there should be exactly one record +in the .dbf file for each shape in the .shp/.shx files. This constraint +must be maintained by the application.

+ + + +

DBFOpen()

+ +
+DBFHandle DBFOpen( const char * pszDBFFile, const char * pszAccess );
+
+  pszDBFFile:		The name of the xBase (.dbf) file to access.
+
+  pszAccess:		The fopen() style access string.  At this time only
+			"rb" (read-only binary) and "rb+" (read/write binary) 
+		        should be used.
+
+ + The DBFOpen() function should be used to establish access to an existing + xBase format table file. The returned DBFHandle is passed to other + access functions, and DBFClose() should be invoked to recover resources, and + flush changes to disk when complete. The DBFCreate() function should + called to create new xBase files. As a convenience, DBFOpen() can be + called with the name of a .shp or .shx file, and it will figure out the + name of the related .dbf file.

+ + + +

DBFCreate()

+ +
+DBFHandle DBFCreate( const char * pszDBFFile );
+
+  pszDBFFile:		The name of the xBase (.dbf) file to create.
+
+ + The DBFCreate() function creates a new xBase format file with the given + name, and returns an access handle that can be used with other DBF functions. + The newly created file will have no fields, and no records. Fields should + be added with DBFAddField() before any records add written. + + + +

DBFGetFieldCount()

+ +
+int DBFGetFieldCount( DBFHandle hDBF );
+
+  hDBF:		The access handle for the file to be queried, as returned
+                by DBFOpen(), or DBFCreate().
+
+ + The DBFGetFieldCount() function returns the number of fields currently + defined for the indicated xBase file. + + + +

DBFGetRecordCount()

+ +
+int DBFGetRecordCount( DBFHandle hDBF );
+
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+ + The DBFGetRecordCount() function returns the number of records that + exist on the xBase file currently. Note that with shape files one xBase + record exists for each shape in the .shp/.shx files.

+ + + +

DBFGetFieldIndex()

+ +
+int DBFGetFieldIndex( DBFHandle hDBF, const char *pszFieldName );
+
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  pszFieldName: Name of the field to search for.
+
+ + Returns the index of the field matching this name, or -1 on failure. The + comparison is case insensitive. However, lengths must match exactly.

+ + + +

DBFGetFieldInfo()

+ +
+DBFFieldType DBFGetFieldInfo( DBFHandle hDBF, int iField, char * pszFieldName,
+                              int * pnWidth, int * pnDecimals );
+
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iField:	The field to be queried.  This should be a number between 
+                0 and n-1, where n is the number fields on the file, as
+                returned by DBFGetFieldCount().
+
+  pszFieldName:	If this pointer is not NULL the name of the requested field
+		will be written to this location.  The pszFieldName buffer 
+                should be at least 12 character is size in order to hold
+		the longest possible field name of 11 characters plus a 
+                terminating zero character.
+
+  pnWidth:	If this pointer is not NULL, the width of the requested field
+		will be returned in the int pointed to by pnWidth.  This is
+                the width in characters.  
+
+  pnDecimals:	If this pointer is not NULL, the number of decimal places
+                precision defined for the field will be returned.  This is
+                zero for integer fields, or non-numeric fields.
+
+ + The DBFGetFieldInfo() returns the type of the requested field, which is + one of the DBFFieldType enumerated values. As well, the field name, and + field width information can optionally be returned. The field type returned + does not correspond one to one with the xBase field types. For instance + the xBase field type for Date will just be returned as being FTInteger.

+ +

+    typedef enum {
+      FTString,			/* fixed length string field 		*/
+      FTInteger,		/* numeric field with no decimals 	*/
+      FTDouble,			/* numeric field with decimals 		*/
+      FTLogical,		/* logical field.                       */
+      FTInvalid                 /* not a recognised field type 		*/
+    } DBFFieldType;
+
+ + + +

DBFAddField()

+ +
+int DBFAddField( DBFHandle hDBF, const char * pszFieldName, 
+                 DBFFieldType eType, int nWidth, int nDecimals );
+
+  hDBF:		The access handle for the file to be updated, as returned by
+		DBFOpen(), or DBFCreate().
+
+  pszFieldName:	The name of the new field.  At most 11 character will be used.
+                In order to use the xBase file in some packages it may be
+                necessary to avoid some special characters in the field names
+                such as spaces, or arithmetic operators.
+
+  eType:	One of FTString, FTInteger or FTDouble in order to establish
+                the type of the new field.  Note that some valid xBase field
+                types cannot be created such as date fields.
+
+  nWidth:	The width of the field to be created.  For FTString fields this
+                establishes the maximum length of string that can be stored.
+                For FTInteger this establishes the number of digits of the
+                largest number that can
+                be represented.  For FTDouble fields this in combination
+                with the nDecimals value establish the size, and precision
+                of the created field.
+
+  nDecimals:    The number of decimal places to reserve for FTDouble fields.
+                For all other field types this should be zero.  For instance
+                with nWidth=7, and nDecimals=3 numbers would be formatted
+                similarly to `123.456'.
+
+ + The DBFAddField() function is used to add new fields to an existing xBase + file opened with DBFOpen(), or created with DBFCreate().

+ + The DBFAddField() return value is the field number of the new field, or + -1 if the addition of the field failed.

+ + + +

DBFReadIntegerAttribute()

+ +
+int DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField );
+  
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) from which the field value
+                should be read.
+
+  iField:	The field within the selected record that should be read.
+
+ + The DBFReadIntegerAttribute() will read the value of one field and return + it as an integer. This can be used even with FTString fields, though the + returned value will be zero if not interpretable as a number.

+ + + +

DBFReadDoubleAttribute()

+ +
+double DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField );
+  
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) from which the field value
+                should be read.
+
+  iField:	The field within the selected record that should be read.
+
+ + The DBFReadDoubleAttribute() will read the value of one field and return + it as a double. This can be used even with FTString fields, though the + returned value will be zero if not interpretable as a number.

+ + + +

DBFReadStringAttribute()

+ +
+const char *DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField );
+  
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) from which the field value
+                should be read.
+
+  iField:	The field within the selected record that should be read.
+
+ + The DBFReadStringAttribute() will read the value of one field and return + it as a string. This function may be used on any field type (including + FTInteger and FTDouble) and will return the string representation stored + in the .dbf file. The returned pointer is to an internal buffer + which is only valid untill the next DBF function call. It's contents may + be copied with normal string functions such as strcpy(), or strdup(). If + the TRIM_DBF_WHITESPACE macro is defined in shapefil.h (it is by default) + then all leading and trailing space (ASCII 32) characters will be stripped + before the string is returned.

+ + + +

DBFIsAttributeNULL()

+ +
+int DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField );
+  
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) from which the field value
+                should be read.
+
+  iField:	The field within the selected record that should be read.
+
+ + This function will return TRUE if the indicated field is NULL valued + otherwise FALSE. Note that NULL fields are represented in the .dbf file + as having all spaces in the field. Reading NULL fields will result in + a value of 0.0 or an empty string with the other DBFRead*Attribute() + functions.

+ + + +

DBFWriteIntegerAttribute

+ +
+int DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField,
+                              int nFieldValue );
+
+  hDBF:		The access handle for the file to be written, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) to which the field value
+                should be written.
+
+  iField:	The field within the selected record that should be written.
+
+  nFieldValue:	The integer value that should be written.
+
+ +The DBFWriteIntegerAttribute() function is used to write a value to a numeric +field (FTInteger, or FTDouble). If the write succeeds the value TRUE will +be returned, otherwise FALSE will be returned. If the value is too large to +fit in the field, it will be truncated and FALSE returned.

+ + + +

DBFWriteDoubleAttribute()

+ +
+int DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField,
+                             double dFieldValue );
+
+  hDBF:		The access handle for the file to be written, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) to which the field value
+                should be written.
+
+  iField:	The field within the selected record that should be written.
+
+  dFieldValue:	The floating point value that should be written.
+
+ +The DBFWriteDoubleAttribute() function is used to write a value to a numeric +field (FTInteger, or FTDouble). If the write succeeds the value TRUE will +be returned, otherwise FALSE will be returned. If the value is too large to +fit in the field, it will be truncated and FALSE returned.

+ + + +

DBFWriteStringAttribute()

+ +
+int DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField,
+                             const char * pszFieldValue );
+
+  hDBF:		The access handle for the file to be written, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) to which the field value
+                should be written.
+
+  iField:	The field within the selected record that should be written.
+
+  pszFieldValue: The string to be written to the field.
+
+ +The DBFWriteStringAttribute() function is used to write a value to a string +field (FString). If the write succeeds the value TRUE willbe returned, +otherwise FALSE will be returned. If the value is too large to +fit in the field, it will be truncated and FALSE returned.

+ + + +

DBFWriteNULLAttribute()

+ +
+int DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField );
+
+  hDBF:		The access handle for the file to be written, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) to which the field value
+                should be written.
+
+  iField:	The field within the selected record that should be written.
+
+ +The DBFWriteNULLAttribute() function is used to clear the indicated field +to a NULL value. In the .dbf file this is represented by setting the entire +field to spaces. If the write succeeds the value TRUE willbe returned, +otherwise FALSE will be returned.

+ + + +

DBFClose()

+ +
+void DBFClose( DBFHandle hDBF );
+
+  hDBF:		The access handle for the file to be closed.
+
+ + The DBFClose() function will close the indicated xBase file (opened with + DBFOpen(), or DBFCreate()), flushing out all information to the file on + disk, and recovering any resources associated with having the file open. + The file handle (hDBF) should not be used again with the DBF API after + calling DBFClose().

+ + + +

DBFIsRecordDeleted()

+ +
+int DBFIsRecordDeleted( DBFHandle hDBF, int iShape );
+
+  hDBF:		The access handle for the file to be checked.
+  iShape:       The record index to check.
+
+ + Returns TRUE (non-zero) if the record is marked for deletion, otherwise + it returns FALSE.

+ + + +

DBFMarkRecordDeleted()

+ +
+int DBFMarkRecordDeleted( DBFHandle hDBF, int iShape, int bIsDeleted );
+
+  hDBF:		The access handle for the file.
+  iShape:       The record index to update.
+  bIsDeleted:   TRUE to mark record deleted, or FALSE to undelete it.
+
+ + Returns TRUE on success, or FALSE on error.

+ + + +

DBFGetNativeFieldType()

+ +
+char DBFGetNativeFieldType( DBFHandle hDBF, int iField );
+
+  hDBF:		The access handle for the file.
+  iField:       The field index to query.
+  
+
+ + This function returns the DBF type code of the indicated field. It will + be one of:

+ +

    +
  • 'C' (String) +
  • 'D' (Date) +
  • 'F' (Float) +
  • 'N' (Numeric, with or without decimal) +
  • 'L' (Logical) +
  • 'M' (Memo: 10 digits .DBT block ptr) +
  • ' ' (field out of range) +
+ + + diff --git a/support/ShapeLib/web/index.html b/support/ShapeLib/web/index.html new file mode 100644 index 00000000..19a43360 --- /dev/null +++ b/support/ShapeLib/web/index.html @@ -0,0 +1,232 @@ + + +Shapefile C Library + + + + +

Shapefile C Library

+ +

Purpose

+ +The Shapefile C Library provides the ability to write simple C programs +for reading, writing and updating (to a limited extent) ESRI Shapefiles, +and the associated attribute file (.dbf).

+ +

Supporting Information

+ + + +

What is a Shapefile?

+ +If you don't know, you probably don't need this library. The Shapefile +format is a working and interchange format promulagated by +ESRI for simple vector data with attributes. +

+ +An excellent white paper on the shapefile format +is available from ESRI, +but it is .pdf format, so you will need Adobe Acrobat to browse it.

+ +The file format actually consists of three files.

+ +

+XXX.shp - holds the actual vertices.
+XXX.shx - hold index data pointing to the structures in the .shp file.
+XXX.dbf - holds the attributes in xBase (dBase) format.  
+
+ +

Download

+ +Source code, and some other odds and ends can be downloaded from +http://download.osgeo.org/shapelib.

+ +Shapelib is available for anonymous CVS access: + +

+  cvs -d :pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot login
+  Password: (hit enter)
+  cvs -d :pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot co shapelib
+
+ +

Bugs, Maintainance and Support

+ +This library is maintained by Frank +Warmerdam. Please send me bug reports, patches and suggestions for the +library via the maptools.org Bugzilla. Shapelib bugs can also be +queried. +

+ +Shapelib is hosted at +shapelib.maptools.org. A mailing +list for discussion of how to use shapelib, and announcing new releases +is +available. To only find out about new releases of Shapelib select the +"Subscribe to new releases" option from the link at +Freshmeat.

+ +

Credits

+ +I didn't start this section anywhere near soon enough, so alot of earlier +contributors to Shapelib are lost in pre-history. + +
    +
  • Bill Miller (NY-DOT) for shputils.c +
  • Carl Anderson for the contents of the contrib directory, and +the "tuple" additions to dbfopen.c. +
  • Andrea Giacomelli for patches for dbfopen.c. +
  • Doug Matthews for portability improvements. +
  • Jan-Oliver Wagner for convincing me to make it available under LGPL, +shared library support, and various other patches. +
  • Dennis Christopher (of Avenza) for testing and bug fixes. +
  • Miko Syrjä (of 3D-system Oy) for a record size bug fix. +
  • Steven Lime and Curtis Hill for help with NULL shapes. +
  • Jim Matthews for support of NULL attributes in dbf files. +
  • PCI Geomatics who let me +release a modified version of their shapefile code in the beginning and +who hosted shapelib for years. +
+ +

In Memorium

+ +I would like to dedicate Shapelib to the memory of Sol Katz. While I never +met him in person, his generous contributions to the GIS community took +many forms, including free distribution of a variety of GIS translators +with source. The fact that he used this Shapelib in some of his utilities, +and thanked me was a great encouragement to me. I hope I can do his memory +honour by trying to contribute in a similar fashion.

+ +

Portability

+ +The Shapefile C Library should port easily to 32bit systems with ANSI C +compilers. It should work on 64 bit architectures (such as the DEC AXP).

+ +Care should also be taken to pass the binary access flag into SHPOpen() +and DBFOpen() when operating on systems with special text file translation +such as MSDOS.

+ +The shputils.c module is contributed, and may not take the same approach +to portability as the rest of the package.

+ +On Linux, and most unix systems it should be possible to build and +install shapefile support as a shared library using the "lib" and "lib_install" +targets of the Makefile. Note that this Makefile doesn't use autoconf +mechanisms and will generally require some hand tailoring for your environment. + +

Limitations

+ +
    + +
  • You can't modify the vertices of existing structures (though you + can update the attributes of existing structures, and create new + structures).

    + +

  • Not written in such a way as to be particularly fast. This is +particularly true of the 1.2 API. For applications more concerned with +speed it may be worth using the V1.1 API.

    + +

  • Doesn't set the last access time properly in the .dbf files.

    + +

  • There is no way to synchronize information to the file except to close it. +

    + +

  • Poor error checking and reporting.

    + +

  • Not professionally supported (well it can be, if you want to pay).

    + +

  • Some aspects of xBase files not supported, though I believe they are +not used by ESRI.

    + +

  • The application must keep the .dbf file in sync with the .shp/.shx +files through appropriate use of the DBF and SHP APIs.

    + +

  • No support for the undocumented .sbn/.sbx spatial index files.

    + +

+ +

Other Shapefile Resources

+ +
    +
  • Shapefile Format Specifications (pdf)

    + +

  • Xbase (.dbf) File Format Description.

    + +

  • Language ID / Code Page mappings

    + +

  • Shapelib is used within the multiformat +OGR library. If you are looking for a +high level C++ library with support for many geospatial vector formats you +might want to check it out.

    + +

  • Ari Jolma has produced an initial perl binding on top of shapelib, +which can be found at CPAN as Geo::ShapeFile under the +Geo module. +

    + +

  • Bernhard Herzog has produced python bindings for Shapelib with +SWIG, available at http://ftp.intevation.de/users/bh/pyshapelib. A new version not using swig is +available as part of Thuban.

    + +

  • Delphi +bindings for Shapelib courtesy of Alexander Weidauer.

    + +

  • Miguel Filgueiras has implemented +Tcl bindings for Shapelib +as part of GPSMan.

    + +

  • David Gancarz has implemented a Microsoft +.NET wrapper for +Shapelib. An example of using shapelib with VB6 is also icluded in the .NET wrapper project file.

    + +

  • Andrey Hristov (php at hristov dot com) has developed a PHP extension +based on Shapelib. It can be found in CVS at http://cvs.php.net/pecl/shp.

    + +

  • Toyoda Eizi has developed Ruby bindings found at +http://sourceforge.net/projects/ruby-shapelib.

    + +

  • Davide Cesari has developed FORTRAN bindings that can be found at + +http://www.webalice.it/o.drofa/davide/shapelib-fortran. + +
  • Jan-Oliver Wagner has implemented a commandline program +(gen2shp) for producing shapefiles from Arc/Info Generate format ASCII +files. He maintains a web page for his work.

    + +

  • Tom Russo has implemented a shpcs2cs program, which reprojects shapefiles +using arguments similar to the PROJ.4 cs2cs program including datum conversion. +Use as an alternate to the contrib/shpproj which doesn't do datums. It is +available at the bottom of Tom's Xastir Shapefile Resources page.

    + +

  • +Andrew Williamson's +Useful +Scripts and Stuff page for ArcView, which includes ShapeChecker.

    + +

  • The University of Bonn +sf4java project apparently includes Java classes for reading Shapefiles.

    + +

  • The ShapeIO2 Visual Basic libraries may be of interest to those wanting +VB access to Shapefiles. Also available locally.

    + +

  • The ShapeFile Read/Write OCX is another option for Visual Basic programmers.

    + +

  • Isovist Analyst is a sort-of-free isovist generating extension for +ArcView using shapelib.

    + +

  • shpdiff utility +by Bryce Nesbitt.

    + +

  • Aequometer: a program for +MS Excel to calculate the area of polygons and export as shapefiles.

    + +

+ + + diff --git a/support/ShapeLib/web/license.html b/support/ShapeLib/web/license.html new file mode 100644 index 00000000..8f826161 --- /dev/null +++ b/support/ShapeLib/web/license.html @@ -0,0 +1,78 @@ + + +Shapelib License + + + + +

License

+ +The source for the Shapefile C Library is (c) 1998 Frank Warmerdam, +and released under the following conditions. The intent is that anyone +can do anything with the code, but that I do not assume any liability, nor +express any warranty for this code.

+ +As of Shapelib 1.2.6 the core portions of the library are made available +under two possible licenses. The licensee can choose to use the code +under either the Library GNU Public License (LGPL) described in +COPYING or under the following MIT style license. Any files in +the Shapelib distribution without explicit copyright license terms +(such as this documentation, the Makefile and so forth) should be +considered to have the following licensing terms. Some auxilary portions +of Shapelib, notably some of the components in the contrib directory +come under slightly different license restrictions. Check the source +files that you are actually using for conditions.

+ +

Default License Terms

+ + +Copyright (c) 1999, Frank Warmerdam

+ +This software is available under the following "MIT Style" license, +or at the option of the licensee under the LGPL (see COPYING). This +option is discussed in more detail in shapelib.html.

+ +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.

+ + +

Shapelib Modifications

+ +I am pleased to receive bug fixes, and improvements for Shapelib. Unless +the submissions indicate otherwise I will assume that changes submitted to +me remain under the the above "dual license" terms. If changes are made +to the library with the intention that those changes should be protected by +the LGPL then I should be informed upon submission. Note that I will not +generally incorporate changes into the core of Shapelib that are protected +under the LGPL as this would effectively limit the whole file and +distribution to LGPL terms.

+ +

Opting for LGPL

+ +For licensee's opting to use Shapelib under LGPL as opposed to the MIT +Style license above, and wishing to redistribute the software based on +Shapelib, I would ask that all "dual license" modules be updated to +indicate that only the LGPL (and not the MIT Style license) applies. This +action represents opting for the LGPL, and thereafter LGPL terms apply to +any redistribution and modification of the affected modules.

+ + + + + + diff --git a/support/ShapeLib/web/manifest.html b/support/ShapeLib/web/manifest.html new file mode 100644 index 00000000..c5121123 --- /dev/null +++ b/support/ShapeLib/web/manifest.html @@ -0,0 +1,87 @@ + + +Shapefile C Library V1.2 + + + + +

Shapelib Manifest

+ +
    +
  • web/index.html: This file - general documentation on the +Shapefile C Library.

    + +

  • web/shp_api.html: Documentation +for the API for accessing the .shp/.shx files.

    + +

  • web/dbf_api.html: Documentation +for the API for accessing the .dbf attribute files.

    + +

  • shpopen.c: C code for access to .shp/.shx vertex files.

    + +

  • dbfopen.c: C code for access to .dbf attribute file.

    + +

  • shapefil.h: Include file defining all the services of dbfopen.c +and shpopen.c.

    + +

  • contrib/: A directory of "in progress" contributed programs +from Carl Anderson.

    + +

  • dbfcreate.c: Simple example program for creating a new .dbf file. +

    + +

  • dbfadd.c: + Simple example program for adding a record to a .dbf file.

    + +

  • dbfdump.c: Simple example program for displaying the contents of + a .dbf file.

    + +

  • shpcreate.c: Simple example program for creating a new .shp and +.shx file.

    + +

  • shpadd.c: Simple example program for adding a shape to an existing + shape file.

    + +

  • shpdump.c: Simple program for dumping all the vertices in a + shapefile with an indicating of the parts.

    + +

  • shputils.c: Complex contributed program capable of clipping and + appending + shapefiles as well as a few other things. Type shputils + after building to get a full usage message.

    + +

  • Makefile: A simple makefile to compile the library and example + programs.

    + +

  • makeshape.sh: A simple script for running some of the example +programs.

    + +

  • shptest.c: A simple test harnass to generate each of the supported + types of shapefiles.

    + + +

  • shptree.c: Implements a simple quadtree algorithm for fast +spatial searches of shapefiles.

    + +

  • shptreedump.c: A simple mainly showing information on quad +trees build using the quad tree api.

    + +

  • stream1.sh - A test script, which should produce stream1.out. +Note this will only work if you have the example data downloaded.

    + +

  • stream1.out: Expected output of stream1.sh test script.

    + +

  • stream2.sh: A test script, which should produce stream2.out.

    + +

  • stream2.out: Expected output of stream2.sh test script.

    + +

  • pyshapelib-0.1: Prototype contributed Python bindings.

    + +

+ + + + + + + diff --git a/support/ShapeLib/web/maptools.css b/support/ShapeLib/web/maptools.css new file mode 100644 index 00000000..0ff995d8 --- /dev/null +++ b/support/ShapeLib/web/maptools.css @@ -0,0 +1,357 @@ +/* Redefined Tags */ + +body { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +h1 { + font-family: Arial, Helvetica, sans-serif; + font-size: 24px; + line-height: 32px; + color: #006699; + border-bottom-width: 2px; + border-bottom-style: solid; + border-bottom-color: #80B3CC; +} +h2 { + font-family: Arial, Helvetica, sans-serif; + font-size: 20px; + line-height: 26px; + color: #006699; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #80B3CC; +} +h3 { + font-family: Arial, Helvetica, sans-serif; + font-size: 16px; + line-height: 20px; + font-weight: bold; + color: #006699; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #80B3CC; +} +h4 { + font-family: Arial, Helvetica, sans-serif; + font-size: 14px; + line-height: 18px; + font-weight: bold; + color: #006699; +} +h5 { + font-family: Arial, Helvetica, sans-serif; + font-size: 13px; + font-weight: bold; + color: #006699; +} +h6 { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + font-weight: bold; +} + +p { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; +} +span { + font-family: Arial, Helvetica, sans-serif; +} +div { + font-family: Arial, Helvetica, sans-serif; +} +blockquote { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +pre { + font-family: "Courier New", Courier, mono; + font-size: 12px; +} +ol { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; +} +ul { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; + list-style-type: square; + list-style-image: url(images/bullets/squarebullet.gif); +} +ul.download { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; + list-style-type: square; + list-style-image: url(images/bullets/dlbullet.gif); +} +ul.document { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; + list-style-type: square; + list-style-image: url(images/bullets/pagebullet.gif); +} +li { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; + margin-top: 4px; +} +dl { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +dd { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +dt { + margin-top: 8px; + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +td { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +font { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} + + +a[href] { + font-family: Arial, Helvetica, sans-serif; + color: #006699; + text-decoration: underline; +} +a[href]:link { + font-family: Arial, Helvetica, sans-serif; + color: #006699; + text-decoration: underline; +} +a[href]:hover { + font-family: Arial, Helvetica, sans-serif; + color: #003366; + text-decoration: underline; +} +a[href]:visited { + font-family: Arial, Helvetica, sans-serif; + color: #003366; + text-decoration: underline; +} +a[href]:active { + font-family: Arial, Helvetica, sans-serif; + color: #199DBF; + text-decoration: underline; +} + + +/* Defined Classes */ + +.copyright { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: none; +} +a.copyright { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: none; +} +a.copyright:link { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: none; +} +a.copyright:hover { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: underline; +} +a.copyright:visited { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: none; +} +a.copyright:active { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: underline; +} + + +.TechNewsHead { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + color: #003366; + line-height: 16px; + margin:0px; + padding: 3px; + padding-top: 14px; + padding-left: 20px; + padding-right: 20px; +} +.TechNewsBody { + font-family: Arial, Helvetica, sans-serif; + font-size: 11px; + line-height: 13px; + color: #000000; + margin:0px; + padding: 3px; + padding-left: 20px; + padding-right: 20px; +} + + +.Intro { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: normal; + color: #003366; + background-color: #EFF3F7; + border: 1px dashed #DCE4ED; + padding: 6px; +} + +.shopbox { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: normal; + color: #003366; + border: 1px dashed #E7E4DA; + background-color: #F7F7EF; + padding: 6px; + padding-bottom: 18px; + padding-top: 18px; +} + +.shopboxTitle { + font-family: Arial, Helvetica, sans-serif; + font-size: 16px; + line-height: 20px; + font-weight: bold; + margin-bottom: 2px; + color: #006699; + text-align: left; +} + +.welcomeTitle { + font-family: Arial, Helvetica, sans-serif; + font-size: 16px; + line-height: 18px; + font-weight: bold; + color: #006699; + text-align: left; +} + +.license { + padding: 5px; + border: 1px solid #003366; +} +table.BlueBox { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + background-color: #003366; + border-spacing: 1px; +} +td.BlueBox { + background-color: #EFF3F7; + font-size: 12px; + color: #003366; + margin:0px; + padding: 4px; +} + +.BlueCopyLt { + color: #006699; +} +.BlueCopyDk { + color: #003366; +} + + +.SideTitle { + font-size: 12px; + font-weight: bold; + line-height: 16px; + color: #003366; + margin:0px; + padding: 4px; + padding-left: 7px; +} +.SideMenuItem { + font-size: 11px; + line-height: 14px; + color: #003366; + margin:0px; + padding:4px; + padding-left: 7px; +} +.SideText { + font-size: 11px; + line-height: 14px; + margin:0px; + padding: 4px; + padding-left: 7px; +} +.TopMenu { + font-size: 11px; + color: #FFFFFF; + margin:0px; + padding: 4px; + padding-left: 7px; +} + +TopMenuItem { + font-size: 11px; + color: #FFFFFF; +} + +a.TopMenuItem { + font-size: 11px; + color: #FFFFFF; + text-decoration: underline; +} + +a.TopMenuItem:link { + font-size: 11px; + color: #FFFFFF; + text-decoration: underline; +} + +a.TopMenuItem:hover { + font-size: 11px; + color: #AFBFCF; + text-decoration: underline; +} + +a.TopMenuItem:visited { + font-size: 11px; + color: #FFFFFF; + text-decoration: underline; +} + +a.TopMenuItem:active { + font-size: 11px; + color: #A0CFFF; + text-decoration: underline; +} + diff --git a/support/ShapeLib/web/release.html b/support/ShapeLib/web/release.html new file mode 100644 index 00000000..ad2349df --- /dev/null +++ b/support/ShapeLib/web/release.html @@ -0,0 +1,103 @@ + + +Shapelib Release Notes + + + + +

Shapelib Release Notes

+ +To get notification of new releases of Shapelib subscribe to +the project at www.freshmeat.net. This is currently the only reliable +way of finding out about new releases since there is no shapelib specific +mailing list.

+ +Release 1.4.1: +

    +
  • Fix a regression regarding re-writing the last shape + of a file (GDAL #7031) +
+ +Release 1.4.0: +
    +
  • Old Makefile build replaced by autoconf/automake (by Sandro Mani) +
  • CMake build system added (by Alan W. Irwin) +
  • Added read support for ESRI .sbn spatial index +
  • Resynchronization with GDAL's Shapefile driver. Mostly cleanups. + SHPObject and DBFInfo structures extended with new members +
  • Add DBFSetLastModifiedDate() to modify the update date in the .dbf +
  • Add SHPSetFastModeReadObject() to read faster (but shapes got that way + share state in the handle, so only one shape at a time can be used) +
  • Add SHPRestoreSHX() to recreate a missing .shx from the .shp and + SHPOpenLLEx(). +
  • Write DBF end-of-file character 0x1A by default. + This behaviour can be controlled with the DBFSetWriteEndOfFileChar() + function. +
+ +Release 1.3.0: +
    +
  • Major rework to us application provided hooks for file io, and error reporting (SAHooks). +
  • Added contrib/Shape_PointInPoly.cpp from Marko Podgorsek. +
  • Added shapelib tools documentation from Eduardo Patto Kanegae. +
  • Added dbf deletion support. +
  • Added DBFAddNativeFieldType(). +
  • Added DBFDeleteField(), DBFReorderFields() and DBFAlterFields() to +rework DBF schema. +
  • likely a variety of other changes - it has been eight years since 1.2.10! +
+ +Release 1.2.10: Added SHPRewindObject() function, and shprewind utility +program. Added FTLogical, DBFReadLogicalAttribute() and +DBFWriteLogicalAttribute() (thanks to Olek Neyman).

+ +Release 1.2.9: Good support for reading and writing NULL fields +in .dbf files, good support for NULL shapes and addition of the +DBFGetFieldIndex() functions (all contributed by Jim Matthews).

+ +An upgraded shputils.c has been contributed by Bill Miller. Daniel +Morissette contributed DBFGetNativeFieldType(). Better error checking +for disk errors in dbfopen.c. Various other bug fixes and safety improvements. +

+ +Release 1.2.8: Added hacked libtool support (supplied by Jan) +and "rpm ready" install logic.

+ +Release 1.2.7: Fix record size (was 4 bytes too long). Modify +SHPReadObject() to handle null shapes properly. Use atof() instead of +sscanf(). Support .DBF as well as .dbf.

+ +Release 1.2.6: Now available under old MIT style license, or at the +users option, LGPL. Added the contrib directory of stuff from Carl Anderson +and the shptree.c API for quadtree based spatial searches.

+ +Release 1.2.5: SHPOpen() now forcably uses "rb" or "r+b" access string +to avoid common mistakes on Windows. Also fixed a serious bug with .dbf +files with a 'F' field type.

+ +Release 1.2.4: DBFOpen() will now automatically translate a .shp +extension to .dbf for convenience. SHPOpen() will try datasets with lower +and uppercase extension. DBFAddField() now returns the field number, +not TRUE/FALSE.

+ +Release 1.2.3: Disable writing measures to multi-patches as ArcView +seems to puke on them (as reported by Monika Sester). Add white space +trimming, and string/numeric attribute interchangability in DBF API +as suggested by Steve Lime. Dbfdump was updated to include several +reporting options.

+ +Release 1.2.2: Added proper support for multipatch (reading and +writing) - this release just for testing purposes.

+ +Release 1.2 is mostly a rewrite of the .shp/.shx access API to account +for ArcView 3.x 3D shapes, and to encapsulate the shapes in a structure. +Existing code using the shapefile library will require substantial changes +to use release 1.2.

+ +Release V1.1 has been built on a number of platforms, and used by a +number of people successfully. V1.1 is the first release with the xBase API +documentation.

+ + + + diff --git a/support/ShapeLib/web/shapelib-tools.html b/support/ShapeLib/web/shapelib-tools.html new file mode 100644 index 00000000..6ff8ea3b --- /dev/null +++ b/support/ShapeLib/web/shapelib-tools.html @@ -0,0 +1,352 @@ + + +ShapeLib Tools - User Guide + + + + +

ShapeLib Tools - User Guide

+ShapeLib is maintained by Frank Warmerdam
+This guide was created by Eduardo Patto Kanegae < eduardo~at~consultoria~dot~eti~dot~br > + + +

dbfcreate

+Purpose: creates a new and empty .dbf file. +
+Usage: dbfcreate xbase_file [[-s field_name width],[-n field_name width decimals]]... +
+
    +
  • xbase_file: the name of xBase file to be created. Doesn't need the extension.
  • +
  • -s field_name width: creates a string field with name field_name and size width.
  • +
  • -n field_name width decimals: creates a numeric field with name field_name, width of width and with decimals places sized by decimals.
  • +
+Example +
+$ dbfcreate testbase -s NAME 20, -n AREA 9 3, -n VALUE 9 2 +
# this will create a file named testbase.dbf with 3 fields: NAME ( string (20)), +AREA ( float (9,3)) and VALUE ( float (9,2)) +
+
+ +

dbfadd

+Purpose: adds a record into an existing .dbf file. +
+Usage: dbfadd xbase_file field_values +
+
    +
  • xbase_file: the name of an existing xBase file.
  • +
  • field_values: list of values to be inserted into the xBase file. + You must specify a number of values equal to the number of fields the xBase file has. + The order of values must also reflect the order of fields inside xBase file.
  • +
+Example +
+$ dbfadd testbase.dbf REGION1 25.656 150.22 +
# assuming that testbase.dbf has 3 fields( NAME, AREA and VALUE), this command line +will insert a new record into testbase.dbf with the value "REGION1" for NAME, +'25.656' for AREA and '150.22' for VALUE field. +
+
+ +

dbfdump

+Purpose: dumps the content of a xBase file to the terminal. +
+Usage: dbfdump [-h] [-r] [-m] xbase_file +
+
    +
  • -h: output header info( field descriptions).
  • +
  • -r: output raw field info, numeric values not reformatted.
  • +
  • -m: output one line per field.
  • +
  • xbase_file: the name of an existing xBase file.
  • +
+Example +
+$ dbfdump -h testbase.dbf +
# assuming that testbase.dbf has 1 record( inserted by previous example using 'dbfadd'), +this command line will produce the following output:
+ +Field 0: Type=String, Title=`NAME', Width=20, Decimals=0
+Field 1: Type=Double, Title=`AREA', Width=9, Decimals=3
+Field 2: Type=Double, Title=`VALUE', Width=9, Decimals=2
+NAME AREA VALUE
+REGION1 25.656 150.22 +
+
+
+ +

shpcreate

+Purpose: creates a new and empty shapefile. +
+Usage: shpcreate shp_file [point|arc|polygon|multipoint] +
+
    +
  • shp_file: the name of shapefile to be created. Doesn't need the extension.
  • +
  • point/arc/polygon/multipoint: the type of shapefile that you wish to create. You must specify a valid option.
  • +
+Example +
+$ shpcreate testpolygon polygon +
# this will create a point shapefile named testpolygon( in fact testpolygon.shp and testpolygon.shx will be created). +
+
+ +

shpadd

+Purpose: adds a shape into an existing shapefile. +
+Usage: shpadd shp_file [[x y] [+]]* +
+
    +
  • shp_file: the name of an existing shapefile.
  • +
  • x1 y1 x2 y2 ... xn yn: the set of x,y coordinates that describes the shape that you wish to add. Note that you must specify the correct number of parameters for a given type of shapefile. e.g.: for point shapefiles you have to pass 1 pair of XY coordinates and for a polygon shapefile you should pass at least 4 pairs of XY coordinates( where the first and the last point must have the same coordinates).
  • +
+Example +
+$ shpadd testpolygon 100000 7000000 250000 6500000 200000 6000000 100000 7000000 +
# assuming that testpolygon is a polygon shapefile, this command line will insert a new shape( a triangle) into testpolygon with the following XY coordinates:
+vertice 0: 100000 7000000 ( this will also be the vertice where the shape starts and ends)
+vertice 1: 250000 6500000
+vertice 2: 200000 6000000
+vertice 3: 100000 7000000
+
+ +

shpdump

+Purpose: dumps content of shapefile showing information like shape type, file extents, total of objects and vertices coordinates. +
+Usage: shpdump [-validate] shp_file +
+
    +
  • -validate: count the number of objects that has invalid ring orderings.
  • +
  • shp_file: the name of an existing shapefile.
  • +
+Example +
+$ shpdump testpolygon +
# assuming that testpolygon is an existing shapefile previously created, this command line will output the following result: +
Shapefile Type: Polygon   # of Shapes: 1
+
+File Bounds: (  100000.000, 6000000.000,0,0)
+         to  (  250000.000, 7000000.000,0,0)
+
+Shape:0 (Polygon)  nVertices=4, nParts=1
+  Bounds:(  100000.000, 6000000.000, 0, 0)
+      to (  250000.000, 7000000.000, 0, 0)
+     (  100000.000, 7000000.000, 0, 0) Ring
+     (  250000.000, 6500000.000, 0, 0)
+     (  200000.000, 6000000.000, 0, 0)
+     (  100000.000, 7000000.000, 0, 0)
+
+ +

shprewind

+Purpose: validates and resets the winding order of rings in polygon geometries to match the ordering required by shapefile specification. This is useful for shapefiles having troubles when checked with a 'shpdump -validate'. +
+Usage: shprewind in_shp_file out_shp_file +
+
    +
  • in_shp_file: the name of an existing shapefile.
  • +
  • out_shp_file: the name of the new fixed shapefile that will be created.
  • +
+Example +
+$ shprewind badshapefile newshapefile +
+
+ +

dbfinfo

+Purpose: displays basic information for a given xBase file, like number of columns, number of records and type of each column. +
+Usage: dbfinfo xbase_file +
+
    +
  • xbase_file: the name of an existing xBase file.
  • +
+Example +
+$ dbfinfo testbase +
+
Info for testbase.dbf
+3 Columns,  1 Records in file
+           NAME          string  (20,0)
+           AREA           float  (9,3)
+          VALUE           float  (9,2)
+
+
+
+ +

dbfcat

+Purpose: appends the records of a source xBase file into a destiny xBase file. Both files must have the same number of fields. +
+Usage: dbfcat [-v] [-f] from_DBFfile to_DBFfile +
+
    +
  • -v: verbose mode.
  • +
  • -f: forces data conversion if data field types is not the same at both files or if is there any null value into from_DBFfile.
  • +
  • from_DBFfile: source xBase file.
  • +
  • to_DBFfile: destiny xBase file.
  • +
+Example +
+$ dbfcat -v testbase1 testbase2 +
+
+ +

shpinfo

+Purpose: displays basic information for a given shapefile, like shapefile type, number of objects and its extents. +
+Usage: shpinfo shp_file +
+
    +
  • shp_file: the name of an existing shapefile.
  • +
+Example +
+$ shpinfo testpolygon +
+
Info for testpolygon
+Polygon(5), 1 Records in file
+File Bounds: (         100000,        6000000)
+        (         250000,        7000000)
+
+ +

shpcat

+Purpose: appends the content of a source shapefile into a destiny shapefile. Both files must be the same shapefile type. +
+Usage: shpcat from_shpfile to_shpfile +
+
    +
  • from_shpfile: source shapefile
  • +
  • to_shpfile: destiny shapefile
  • +
+Example +
+$ shpcat shapefile1 shapefile2 +
+
+ +

shpcentrd

+Purpose: computes XY centroid for polygon shapefiles. +
+Usage: shpcentrd shp_file new_shp_file +
+
    +
  • shp_file: the name of an existing polygon shapefile.
  • +
  • new_shp_file: the name of the point shapefile that will created.
  • +
+Example +
+$ shpcentrd apolygonfile pointcentrd +
+
+ +

shpdxf

+Purpose: creates a DXF file from an existing shapefile. +
+Usage: shpdxf shapefile {idfield} +
+
    +
  • shapefile: the name of an existing shapefile.
  • +
  • idfield: explain
  • +
+Example +
+$ shpdxf testshapefile IDFIELD +
# explain the command +
+
+ +

shpfix

+Purpose: Utility program to fix nulls and inconsistencies in Shapefiles +as happens from time to time. +
+Usage: shpfix shpfile new_file <Record# to Blank> +
+
    +
  • shpfile: input file
  • +
  • new_file: output file
  • +
+Example +
+$ shpfix broken fixed +
+
+ +

shpproj

+Purpose: Reproject Shapefiles using PROJ.4 +
+Usage: shpproj shp_file new_shp ( -i=in_proj_file | -i="in_params" | -i=geographic ) ( -o=out_info_file | -o="out_params" | -o=geographic ) +
+
    +
  • param1: explain
  • +
  • param2: explain
  • +
+

+ +INPUT
+ Input can come from one of three sources. A projection parameter file, + directly through parameters or geographic. If the shapefile has an associated + prj file, name the same as the shapefile but ending in ".prj" it will be used + by default ignoring all other parameters. If input is omitted it defaults to + geographic, unless the default prj file exists.

+ +OUTPUT
+ Output can come from one of three sources. A projection parameter file, + directly through parameters or geographic. If output is omitted it defaults + to geographic.

+ +PROJECTION PARAMETER FILE
+ This file MUST end with the extension ".prj". It has the form of one + projection parameter per line. Parameters can be in any order. The + projection parameters are those used to define a PROJ.4 projection.

+ +PROJECTION PARAMETERS
+ Are the same as used by proj and invproj.

+

+  use      proj -lP   to see available projections
+	   proj -lu   to see available units
+	   proj -le   to see available ellipsoid
+
+ +Or visit the PROJ.4 web page at http://www.remotesensing.org/proj for more details.

+ +

+ +Example
+ +the following example projects file rowtest to row3, moving data from Stateplane NAD83 zone 1002 to utm zone 16 in meters

+ +

+ 
+shpproj rowtest row -i="init=nad83:1002 units=us-ft" -o="proj=utm zone=16 units=m"
+
+shpproj rowtest row3 -o="proj=utm zone=18 units=m" -i="zone=16 proj=utm units=us-ft"
+
+shpproj rowtest row3 -o="proj=utm zone=18 units=m" 
+
+shpproj rowtest row3 -i=myfile.prj -o=geographic
+shpproj rowtest row3 -is=myfile.prj
+
+ +
+ + + diff --git a/support/ShapeLib/web/shp_api.html b/support/ShapeLib/web/shp_api.html new file mode 100644 index 00000000..d773e3e5 --- /dev/null +++ b/support/ShapeLib/web/shp_api.html @@ -0,0 +1,376 @@ + + +.SHP File API + + + +

.SHP File API

+ +The .SHP API uses a SHPHandle to represent an open .shp/.shx file pair. +The contents of the SHPHandle are visible (see shapefile.h) but should +be ignored by the application. It is intended that all information be +accessed by the API functions.

+ + + +

Shape Types

+ +Shapes have types associated with them. The following is a list of the +different shapetypes supported by Shapefiles. At this time all shapes in +a Shapefile must be of the same type (with the exception of NULL shapes).

+ +

+  #define SHPT_NULL             0
+
+  2D Shape Types (pre ArcView 3.x):
+
+  #define SHPT_POINT		1	Points
+  #define SHPT_ARC		3	Arcs (Polylines, possible in parts)
+  #define SHPT_POLYGON		5	Polygons (possible in parts)
+  #define SHPT_MULTIPOINT	8	MultiPoint (related points)
+
+  3D Shape Types (may include "measure" values for vertices):
+
+  #define SHPT_POINTZ		11	
+  #define SHPT_ARCZ		13
+  #define SHPT_POLYGONZ		15
+  #define SHPT_MULTIPOINTZ 	18
+
+  2D + Measure Types:
+
+  #define SHPT_POINTM		21
+  #define SHPT_ARCM		23
+  #define SHPT_POLYGONM		25
+  #define SHPT_MULTIPOINTM 	28
+
+  Complex (TIN-like) with Z, and Measure:
+
+  #define SHPT_MULTIPATCH 	31
+
+ + + +

SHPObject

+ +An individual shape is represented by the SHPObject structure. SHPObject's +created with SHPCreateObject(), SHPCreateSimpleObject(), or SHPReadObject() +should be disposed of with SHPDestroyObject().

+ +

+  typedef struct
+  {
+    int		nSHPType;	Shape Type (SHPT_* - see list above)
+
+    int		nShapeId; 	Shape Number (-1 is unknown/unassigned)
+
+    int		nParts;		# of Parts (0 implies single part with no info)
+    int		*panPartStart;  Start Vertex of part
+    int		*panPartType;	Part Type (SHPP_RING if not SHPT_MULTIPATCH)
+    
+    int		nVertices;	Vertex list 
+    double	*padfX;		
+    double	*padfY;
+    double	*padfZ;		(all zero if not provided)
+    double	*padfM;		(all zero if not provided)
+
+    double	dfXMin;		Bounds in X, Y, Z and M dimensions
+    double	dfYMin;
+    double	dfZMin;
+    double	dfMMin;
+
+    double	dfXMax;
+    double	dfYMax;
+    double	dfZMax;
+    double	dfMMax;
+  } SHPObject;
+
+ + + +

SHPOpen()

+ +
+SHPHandle SHPOpen( const char * pszShapeFile, const char * pszAccess );
+
+  pszShapeFile:		The name of the layer to access.  This can be the
+			name of either the .shp or the .shx file or can
+			just be the path plus the basename of the pair.
+
+  pszAccess:		The fopen() style access string.  At this time only
+			"rb" (read-only binary) and "rb+" (read/write binary) 
+		        should be used.
+
+ + The SHPOpen() function should be used to establish access to the two files + for accessing vertices (.shp and .shx). Note that both files have to + be in the indicated directory, and must have the expected extensions in + lower case. The returned SHPHandle is passed to other access functions, + and SHPClose() should be invoked to recover resources, and flush changes + to disk when complete.

+ + + +

SHPGetInfo()

+ +
+void SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType,
+                 double * padfMinBound, double * padfMaxBound );
+
+  hSHP:			The handle previously returned by SHPOpen() 
+			or SHPCreate().
+
+  pnEntities:		A pointer to an integer into which the number of
+			entities/structures should be placed.  May be NULL.
+
+  pnShapetype:		A pointer to an integer into which the shapetype
+			of this file should be placed.  Shapefiles may contain
+			either SHPT_POINT, SHPT_ARC, SHPT_POLYGON or 
+			SHPT_MULTIPOINT entities.  This may be NULL.
+
+  padfMinBound:		The X, Y, Z and M minimum values will be placed into
+                        this four entry array.  This may be NULL.
+			
+  padfMaxBound:		The X, Y, Z and M maximum values will be placed into
+                        this four entry array.  This may be NULL.
+
+ + The SHPGetInfo() function retrieves various information about shapefile + as a whole. The bounds are read from the file header, and may be + inaccurate if the file was improperly generated.

+ + + +

SHPReadObject()

+ +
+SHPObject *SHPReadObject( SHPHandle hSHP, int iShape );
+
+  hSHP:			The handle previously returned by SHPOpen() 
+			or SHPCreate().
+
+  iShape:		The entity number of the shape to read.  Entity 
+			numbers are between 0 and nEntities-1 (as returned
+			by SHPGetInfo()).
+
+ + The SHPReadObject() call is used to read a single structure, or entity + from the shapefile. See the definition of the SHPObject structure for + detailed information on fields of a SHPObject. SHPObject's returned from + SHPReadObject() should be deallocated with SHPDestroyShape(). + SHPReadObject() will return NULL if an illegal iShape value is requested.

+ + Note that the bounds placed into the SHPObject are those read from the + file, and may not be correct. For points the bounds are generated from + the single point since bounds aren't normally provided for point types.

+ + Generally the shapes returned will be of the type of the file as a whole. + However, any file may also contain type SHPT_NULL shapes which will have + no geometry. Generally speaking applications should skip rather than + preserve them, as they usually represented interactively deleted shapes.

+ + + +

SHPClose()

+ +
+void	SHPClose( SHPHandle hSHP );
+
+  hSHP:			The handle previously returned by SHPOpen() 
+			or SHPCreate().
+
+ + The SHPClose() function will close the .shp and .shx files, and flush + all outstanding header information to the files. It will also recover + resources associated with the handle. After this call the hSHP handle + cannot be used again.

+ + + +

SHPCreate()

+ +
+SHPHandle SHPCreate( const char * pszShapeFile, int nShapeType );
+
+  pszShapeFile:		The name of the layer to access.  This can be the
+			name of either the .shp or the .shx file or can
+			just be the path plus the basename of the pair.
+
+  nShapeType:		The type of shapes to be stored in the newly created
+			file.  It may be either SHPT_POINT, SHPT_ARC, 
+		        SHPT_POLYGON or SHPT_MULTIPOINT.
+
+ + The SHPCreate() function will create a new .shp and .shx file of the + desired type.

+ + + +

SHPCreateSimpleObject()

+ +
+SHPObject * 
+     SHPCreateSimpleObject( int nSHPType, int nVertices, 
+			    double *padfX, double * padfY, double *padfZ, );
+
+  nSHPType:		The SHPT_ type of the object to be created, such
+                        as SHPT_POINT, or SHPT_POLYGON.
+  
+  nVertices:		The number of vertices being passed in padfX,    
+                        padfY, and padfZ. 
+
+  padfX:		An array of nVertices X coordinates of the vertices
+                        for this object.
+
+  padfY:		An array of nVertices Y coordinates of the vertices
+                        for this object.
+
+  padfZ:		An array of nVertices Z coordinates of the vertices
+                        for this object.  This may be NULL in which case
+		        they are all assumed to be zero.
+
+ + The SHPCreateSimpleObject() allows for the convenient creation of + simple objects. This is normally used so that the SHPObject can be + passed to SHPWriteObject() to write it to the file. The simple object + creation API assumes an M (measure) value of zero for each vertex. For + complex objects (such as polygons) it is assumed that there is only one + part, and that it is of the default type (SHPP_RING).

+ + Use the SHPCreateObject() function for more sophisticated objects. The + SHPDestroyObject() function should be used to free resources associated with + an object allocated with SHPCreateSimpleObject().

+ + This function computes a bounding box for the SHPObject from the given + vertices.

+ + + +

SHPCreateObject()

+ +
+SHPObject * 
+     SHPCreateObject( int nSHPType, int iShape,
+                      int nParts, int * panPartStart, int * panPartType,
+                      int nVertices, double *padfX, double * padfY, 
+                      double *padfZ, double *padfM );
+
+  nSHPType:		The SHPT_ type of the object to be created, such
+                        as SHPT_POINT, or SHPT_POLYGON.
+
+  iShape:		The shapeid to be recorded with this shape.
+
+  nParts:		The number of parts for this object.  If this is
+                        zero for ARC, or POLYGON type objects, a single 
+                        zero valued part will be created internally.
+  
+  panPartStart:		The list of zero based start vertices for the rings
+                        (parts) in this object.  The first should always be
+                        zero.  This may be NULL if nParts is 0.
+  
+  panPartType:		The type of each of the parts.  This is only meaningful
+                        for MULTIPATCH files.  For all other cases this may
+                        be NULL, and will be assumed to be SHPP_RING.
+  
+  nVertices:		The number of vertices being passed in padfX,    
+                        padfY, and padfZ. 
+
+  padfX:		An array of nVertices X coordinates of the vertices
+                        for this object.
+
+  padfY:		An array of nVertices Y coordinates of the vertices
+                        for this object.
+
+  padfZ:		An array of nVertices Z coordinates of the vertices
+                        for this object.  This may be NULL in which case
+		        they are all assumed to be zero.
+
+  padfM:		An array of nVertices M (measure values) of the 
+			vertices for this object.  This may be NULL in which 
+			case they are all assumed to be zero.
+
+ + The SHPCreateSimpleObject() allows for the creation of objects (shapes). + This is normally used so that the SHPObject can be passed to + SHPWriteObject() to write it to the file.

+ + The SHPDestroyObject() function should be used to free resources associated + with an object allocated with SHPCreateObject().

+ + This function computes a bounding box for the SHPObject from the given + vertices.

+ + + +

SHPComputeExtents()

+ +
+void SHPComputeExtents( SHPObject * psObject );
+
+  psObject:		An existing shape object to be updated in place.
+
+ + This function will recompute the extents of this shape, replacing the + existing values of the dfXMin, dfYMin, dfZMin, dfMMin, dfXMax, dfYMax, + dfZMax, and dfMMax values based on the current set of vertices for the + shape. This function is automatically called by SHPCreateObject() but + if the vertices of an existing object are altered it should be called again + to fix up the extents.

+ + + +

SHPWriteObject()

+ +
+int SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject *psObject );
+
+  hSHP:			The handle previously returned by SHPOpen("r+") 
+			or SHPCreate().
+
+  iShape:		The entity number of the shape to write.  A value of
+		        -1 should be used for new shapes.  
+
+  psObject:		The shape to write to the file. This should have
+                        been created with SHPCreateObject(), or 
+                        SHPCreateSimpleObject().
+
+ + The SHPWriteObject() call is used to write a single structure, or entity + to the shapefile. See the definition of the SHPObject structure for + detailed information on fields of a SHPObject. The return value is the + entity number of the written shape.

+ + + +

SHPDestroyObject()

+ +
+void SHPDestroyObject( SHPObject *psObject );
+
+  psObject:		The object to deallocate.
+
+ + This function should be used to deallocate the resources associated with + a SHPObject when it is no longer needed, including those created with + SHPCreateSimpleObject(), SHPCreateObject() and returned from SHPReadObject(). +

+ + + +

SHPRewindObject()

+ +
+int SHPRewindObject( SHPHandle hSHP, SHPObject *psObject );
+
+  hSHP:                 The shapefile (not used at this time).
+  psObject:		The object to deallocate.
+
+ + This function will reverse any rings necessary in order to enforce the + shapefile restrictions on the required order of inner and outer rings in + the Shapefile specification. It returns TRUE if a change is made and FALSE + if no change is made. Only polygon objects will be affected though any + object may be passed. +

+ + + diff --git a/support/SupportLibs.sln b/support/SupportLibs.sln index 61504088..53ee3c04 100644 --- a/support/SupportLibs.sln +++ b/support/SupportLibs.sln @@ -1,12 +1,14 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 +VisualStudioVersion = 12.0.40629.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "spatialindex-mw", "spatialindex\spatialindex-vc\spatialindex.vcxproj", "{38FBBD59-8344-4D8E-B728-3D51763B6A70}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cqlib", "cqlib\cqlib.vcxproj", "{E81699D6-81BA-41BF-A3A9-DD4CEF0B4E95}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShapeLib", "ShapeLib\ShapeLib.vcxproj", "{A0B00502-605B-4382-B313-5983F6BC8E71}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -17,6 +19,7 @@ Global GlobalSection(ProjectConfigurationPlatforms) = postSolution {38FBBD59-8344-4D8E-B728-3D51763B6A70}.Debug|Win32.ActiveCfg = Debug|Win32 {38FBBD59-8344-4D8E-B728-3D51763B6A70}.Debug|Win32.Build.0 = Debug|Win32 + {38FBBD59-8344-4D8E-B728-3D51763B6A70}.Debug|Win32.Deploy.0 = Debug|Win32 {38FBBD59-8344-4D8E-B728-3D51763B6A70}.Debug|x64.ActiveCfg = Debug|x64 {38FBBD59-8344-4D8E-B728-3D51763B6A70}.Debug|x64.Build.0 = Debug|x64 {38FBBD59-8344-4D8E-B728-3D51763B6A70}.Release|Win32.ActiveCfg = Release|Win32 @@ -25,12 +28,21 @@ Global {38FBBD59-8344-4D8E-B728-3D51763B6A70}.Release|x64.Build.0 = Release|x64 {E81699D6-81BA-41BF-A3A9-DD4CEF0B4E95}.Debug|Win32.ActiveCfg = Debug|Win32 {E81699D6-81BA-41BF-A3A9-DD4CEF0B4E95}.Debug|Win32.Build.0 = Debug|Win32 + {E81699D6-81BA-41BF-A3A9-DD4CEF0B4E95}.Debug|Win32.Deploy.0 = Debug|Win32 {E81699D6-81BA-41BF-A3A9-DD4CEF0B4E95}.Debug|x64.ActiveCfg = Debug|x64 {E81699D6-81BA-41BF-A3A9-DD4CEF0B4E95}.Debug|x64.Build.0 = Debug|x64 {E81699D6-81BA-41BF-A3A9-DD4CEF0B4E95}.Release|Win32.ActiveCfg = Release|Win32 {E81699D6-81BA-41BF-A3A9-DD4CEF0B4E95}.Release|Win32.Build.0 = Release|Win32 {E81699D6-81BA-41BF-A3A9-DD4CEF0B4E95}.Release|x64.ActiveCfg = Release|x64 {E81699D6-81BA-41BF-A3A9-DD4CEF0B4E95}.Release|x64.Build.0 = Release|x64 + {A0B00502-605B-4382-B313-5983F6BC8E71}.Debug|Win32.ActiveCfg = Debug|Win32 + {A0B00502-605B-4382-B313-5983F6BC8E71}.Debug|Win32.Build.0 = Debug|Win32 + {A0B00502-605B-4382-B313-5983F6BC8E71}.Debug|x64.ActiveCfg = Debug|x64 + {A0B00502-605B-4382-B313-5983F6BC8E71}.Debug|x64.Build.0 = Debug|x64 + {A0B00502-605B-4382-B313-5983F6BC8E71}.Release|Win32.ActiveCfg = Release|Win32 + {A0B00502-605B-4382-B313-5983F6BC8E71}.Release|Win32.Build.0 = Release|Win32 + {A0B00502-605B-4382-B313-5983F6BC8E71}.Release|x64.ActiveCfg = Release|x64 + {A0B00502-605B-4382-B313-5983F6BC8E71}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/support/cqlib/cqlib.vcxproj b/support/cqlib/cqlib.vcxproj index aaaf1b04..1e4cae4d 100644 --- a/support/cqlib/cqlib.vcxproj +++ b/support/cqlib/cqlib.vcxproj @@ -71,20 +71,20 @@ <_ProjectFileVersion>12.0.21005.1 - .\Debug\ - .\Debug\ + $(SolutionDir)lib\$(PlatformToolset)\$(Platform)\ + $(ProjectDir)$(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ + $(SolutionDir)lib\$(PlatformToolset)\$(Platform)\ + $(ProjectDir)$(Platform)\$(Configuration)\ $(SolutionDir)lib\$(PlatformToolset)\$(Platform)\ - $(Configuration)\$(Platform)\ + $(ProjectDir)$(Platform)\$(Configuration)\ $(SolutionDir)lib\$(PlatformToolset)\$(Platform)\ - $(Configuration)\$(Platform)\ + $(ProjectDir)$(Platform)\$(Configuration)\ diff --git a/support/include/ShapeLib/shapefil.h b/support/include/ShapeLib/shapefil.h new file mode 100644 index 00000000..8c5311c4 --- /dev/null +++ b/support/include/ShapeLib/shapefil.h @@ -0,0 +1,624 @@ +#ifndef SHAPEFILE_H_INCLUDED +#define SHAPEFILE_H_INCLUDED + +/****************************************************************************** + * $Id: shapefil.h 37997 2017-04-14 10:20:57Z rouault $ + * + * Project: Shapelib + * Purpose: Primary include file for Shapelib. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * Copyright (c) 2012-2016, Even Rouault + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * 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. + ****************************************************************************** + */ + +#include + +#ifdef USE_DBMALLOC +#include +#endif + +#ifdef USE_CPL +#include "cpl_conv.h" + +/* Hide shapelib symbols in GDAL builds --with-hide-internal-symbols */ +#if !defined(SHPAPI_CALL) && defined(USE_GCC_VISIBILITY_FLAG) +#define SHPAPI_CALL +#endif + +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************/ +/* Configuration options. */ +/************************************************************************/ + +/* -------------------------------------------------------------------- */ +/* Should the DBFReadStringAttribute() strip leading and */ +/* trailing white space? */ +/* -------------------------------------------------------------------- */ +#define TRIM_DBF_WHITESPACE + +/* -------------------------------------------------------------------- */ +/* Should we write measure values to the Multipatch object? */ +/* Reportedly ArcView crashes if we do write it, so for now it */ +/* is disabled. */ +/* -------------------------------------------------------------------- */ +#define DISABLE_MULTIPATCH_MEASURE + +/* -------------------------------------------------------------------- */ +/* SHPAPI_CALL */ +/* */ +/* The following two macros are present to allow forcing */ +/* various calling conventions on the Shapelib API. */ +/* */ +/* To force __stdcall conventions (needed to call Shapelib */ +/* from Visual Basic and/or Dephi I believe) the makefile could */ +/* be modified to define: */ +/* */ +/* /DSHPAPI_CALL=__stdcall */ +/* */ +/* If it is desired to force export of the Shapelib API without */ +/* using the shapelib.def file, use the following definition. */ +/* */ +/* /DSHAPELIB_DLLEXPORT */ +/* */ +/* To get both at once it will be necessary to hack this */ +/* include file to define: */ +/* */ +/* #define SHPAPI_CALL __declspec(dllexport) __stdcall */ +/* #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall */ +/* */ +/* The complexity of the situation is partly caused by the */ +/* peculiar requirement of Visual C++ that __stdcall appear */ +/* after any "*"'s in the return value of a function while the */ +/* __declspec(dllexport) must appear before them. */ +/* -------------------------------------------------------------------- */ + +#ifdef SHAPELIB_DLLEXPORT +# define SHPAPI_CALL __declspec(dllexport) +# define SHPAPI_CALL1(x) __declspec(dllexport) x +#endif + +#ifndef SHPAPI_CALL +# if defined(USE_GCC_VISIBILITY_FLAG) +# define SHPAPI_CALL __attribute__ ((visibility("default"))) +# define SHPAPI_CALL1(x) __attribute__ ((visibility("default"))) x +# else +# define SHPAPI_CALL +# endif +#endif + +#ifndef SHPAPI_CALL1 +# define SHPAPI_CALL1(x) x SHPAPI_CALL +#endif + +/* -------------------------------------------------------------------- */ +/* Macros for controlling CVSID and ensuring they don't appear */ +/* as unreferenced variables resulting in lots of warnings. */ +/* -------------------------------------------------------------------- */ +#ifndef DISABLE_CVSID +# if defined(__GNUC__) && __GNUC__ >= 4 +# define SHP_CVSID(string) static const char cpl_cvsid[] __attribute__((used)) = string; +# else +# define SHP_CVSID(string) static const char cpl_cvsid[] = string; \ +static const char *cvsid_aw() { return( cvsid_aw() ? NULL : cpl_cvsid ); } +# endif +#else +# define SHP_CVSID(string) +#endif + +/* -------------------------------------------------------------------- */ +/* On some platforms, additional file IO hooks are defined that */ +/* UTF-8 encoded filenames Unicode filenames */ +/* -------------------------------------------------------------------- */ +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define SHPAPI_WINDOWS +# define SHPAPI_UTF8_HOOKS +#endif + +/* -------------------------------------------------------------------- */ +/* IO/Error hook functions. */ +/* -------------------------------------------------------------------- */ +typedef int *SAFile; + +#ifndef SAOffset +typedef unsigned long SAOffset; +#endif + +typedef struct { + SAFile (*FOpen) ( const char *filename, const char *access); + SAOffset (*FRead) ( void *p, SAOffset size, SAOffset nmemb, SAFile file); + SAOffset (*FWrite)( void *p, SAOffset size, SAOffset nmemb, SAFile file); + SAOffset (*FSeek) ( SAFile file, SAOffset offset, int whence ); + SAOffset (*FTell) ( SAFile file ); + int (*FFlush)( SAFile file ); + int (*FClose)( SAFile file ); + int (*Remove) ( const char *filename ); + + void (*Error) ( const char *message ); + double (*Atof) ( const char *str ); +} SAHooks; + +void SHPAPI_CALL SASetupDefaultHooks( SAHooks *psHooks ); +#ifdef SHPAPI_UTF8_HOOKS +void SHPAPI_CALL SASetupUtf8Hooks( SAHooks *psHooks ); +#endif + +/************************************************************************/ +/* SHP Support. */ +/************************************************************************/ +typedef struct tagSHPObject SHPObject; + +typedef struct +{ + SAHooks sHooks; + + SAFile fpSHP; + SAFile fpSHX; + + int nShapeType; /* SHPT_* */ + + unsigned int nFileSize; /* SHP file */ + + int nRecords; + int nMaxRecords; + unsigned int*panRecOffset; + unsigned int *panRecSize; + + double adBoundsMin[4]; + double adBoundsMax[4]; + + int bUpdated; + + unsigned char *pabyRec; + int nBufSize; + + int bFastModeReadObject; + unsigned char *pabyObjectBuf; + int nObjectBufSize; + SHPObject* psCachedObject; +} SHPInfo; + +typedef SHPInfo * SHPHandle; + +/* -------------------------------------------------------------------- */ +/* Shape types (nSHPType) */ +/* -------------------------------------------------------------------- */ +#define SHPT_NULL 0 +#define SHPT_POINT 1 +#define SHPT_ARC 3 +#define SHPT_POLYGON 5 +#define SHPT_MULTIPOINT 8 +#define SHPT_POINTZ 11 +#define SHPT_ARCZ 13 +#define SHPT_POLYGONZ 15 +#define SHPT_MULTIPOINTZ 18 +#define SHPT_POINTM 21 +#define SHPT_ARCM 23 +#define SHPT_POLYGONM 25 +#define SHPT_MULTIPOINTM 28 +#define SHPT_MULTIPATCH 31 + +/* -------------------------------------------------------------------- */ +/* Part types - everything but SHPT_MULTIPATCH just uses */ +/* SHPP_RING. */ +/* -------------------------------------------------------------------- */ + +#define SHPP_TRISTRIP 0 +#define SHPP_TRIFAN 1 +#define SHPP_OUTERRING 2 +#define SHPP_INNERRING 3 +#define SHPP_FIRSTRING 4 +#define SHPP_RING 5 + +/* -------------------------------------------------------------------- */ +/* SHPObject - represents on shape (without attributes) read */ +/* from the .shp file. */ +/* -------------------------------------------------------------------- */ +struct tagSHPObject +{ + int nSHPType; + + int nShapeId; /* -1 is unknown/unassigned */ + + int nParts; + int *panPartStart; + int *panPartType; + + int nVertices; + double *padfX; + double *padfY; + double *padfZ; + double *padfM; + + double dfXMin; + double dfYMin; + double dfZMin; + double dfMMin; + + double dfXMax; + double dfYMax; + double dfZMax; + double dfMMax; + + int bMeasureIsUsed; + int bFastModeReadObject; +}; + +/* -------------------------------------------------------------------- */ +/* SHP API Prototypes */ +/* -------------------------------------------------------------------- */ + +/* If pszAccess is read-only, the fpSHX field of the returned structure */ +/* will be NULL as it is not necessary to keep the SHX file open */ +SHPHandle SHPAPI_CALL + SHPOpen( const char * pszShapeFile, const char * pszAccess ); +SHPHandle SHPAPI_CALL + SHPOpenLL( const char *pszShapeFile, const char *pszAccess, + SAHooks *psHooks ); +SHPHandle SHPAPI_CALL + SHPOpenLLEx( const char *pszShapeFile, const char *pszAccess, + SAHooks *psHooks, int bRestoreSHX ); + +int SHPAPI_CALL + SHPRestoreSHX( const char *pszShapeFile, const char *pszAccess, + SAHooks *psHooks ); + +/* If setting bFastMode = TRUE, the content of SHPReadObject() is owned by the SHPHandle. */ +/* So you cannot have 2 valid instances of SHPReadObject() simultaneously. */ +/* The SHPObject padfZ and padfM members may be NULL depending on the geometry */ +/* type. It is illegal to free at hand any of the pointer members of the SHPObject structure */ +void SHPAPI_CALL SHPSetFastModeReadObject( SHPHandle hSHP, int bFastMode ); + +SHPHandle SHPAPI_CALL + SHPCreate( const char * pszShapeFile, int nShapeType ); +SHPHandle SHPAPI_CALL + SHPCreateLL( const char * pszShapeFile, int nShapeType, + SAHooks *psHooks ); +void SHPAPI_CALL + SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType, + double * padfMinBound, double * padfMaxBound ); + +SHPObject SHPAPI_CALL1(*) + SHPReadObject( SHPHandle hSHP, int iShape ); +int SHPAPI_CALL + SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject ); + +void SHPAPI_CALL + SHPDestroyObject( SHPObject * psObject ); +void SHPAPI_CALL + SHPComputeExtents( SHPObject * psObject ); +SHPObject SHPAPI_CALL1(*) + SHPCreateObject( int nSHPType, int nShapeId, int nParts, + const int * panPartStart, const int * panPartType, + int nVertices, + const double * padfX, const double * padfY, + const double * padfZ, const double * padfM ); +SHPObject SHPAPI_CALL1(*) + SHPCreateSimpleObject( int nSHPType, int nVertices, + const double * padfX, + const double * padfY, + const double * padfZ ); + +int SHPAPI_CALL + SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ); + +void SHPAPI_CALL SHPClose( SHPHandle hSHP ); +void SHPAPI_CALL SHPWriteHeader( SHPHandle hSHP ); + +const char SHPAPI_CALL1(*) + SHPTypeName( int nSHPType ); +const char SHPAPI_CALL1(*) + SHPPartTypeName( int nPartType ); + +/* -------------------------------------------------------------------- */ +/* Shape quadtree indexing API. */ +/* -------------------------------------------------------------------- */ + +/* this can be two or four for binary or quad tree */ +#define MAX_SUBNODE 4 + +/* upper limit of tree levels for automatic estimation */ +#define MAX_DEFAULT_TREE_DEPTH 12 + +typedef struct shape_tree_node +{ + /* region covered by this node */ + double adfBoundsMin[4]; + double adfBoundsMax[4]; + + /* list of shapes stored at this node. The papsShapeObj pointers + or the whole list can be NULL */ + int nShapeCount; + int *panShapeIds; + SHPObject **papsShapeObj; + + int nSubNodes; + struct shape_tree_node *apsSubNode[MAX_SUBNODE]; + +} SHPTreeNode; + +typedef struct +{ + SHPHandle hSHP; + + int nMaxDepth; + int nDimension; + int nTotalCount; + + SHPTreeNode *psRoot; +} SHPTree; + +SHPTree SHPAPI_CALL1(*) + SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, + double *padfBoundsMin, double *padfBoundsMax ); +void SHPAPI_CALL + SHPDestroyTree( SHPTree * hTree ); + +int SHPAPI_CALL + SHPWriteTree( SHPTree *hTree, const char * pszFilename ); + +int SHPAPI_CALL + SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject ); +int SHPAPI_CALL + SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId ); + +void SHPAPI_CALL + SHPTreeTrimExtraNodes( SHPTree * hTree ); + +int SHPAPI_CALL1(*) + SHPTreeFindLikelyShapes( SHPTree * hTree, + double * padfBoundsMin, + double * padfBoundsMax, + int * ); +int SHPAPI_CALL + SHPCheckBoundsOverlap( double *, double *, double *, double *, int ); + +int SHPAPI_CALL1(*) +SHPSearchDiskTree( FILE *fp, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ); + +typedef struct SHPDiskTreeInfo* SHPTreeDiskHandle; + +SHPTreeDiskHandle SHPAPI_CALL + SHPOpenDiskTree( const char* pszQIXFilename, + SAHooks *psHooks ); + +void SHPAPI_CALL + SHPCloseDiskTree( SHPTreeDiskHandle hDiskTree ); + +int SHPAPI_CALL1(*) +SHPSearchDiskTreeEx( SHPTreeDiskHandle hDiskTree, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ); + +int SHPAPI_CALL + SHPWriteTreeLL(SHPTree *hTree, const char *pszFilename, SAHooks *psHooks ); + +/* -------------------------------------------------------------------- */ +/* SBN Search API */ +/* -------------------------------------------------------------------- */ + +typedef struct SBNSearchInfo* SBNSearchHandle; + +SBNSearchHandle SHPAPI_CALL + SBNOpenDiskTree( const char* pszSBNFilename, + SAHooks *psHooks ); + +void SHPAPI_CALL + SBNCloseDiskTree( SBNSearchHandle hSBN ); + +int SHPAPI_CALL1(*) +SBNSearchDiskTree( SBNSearchHandle hSBN, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ); + +int SHPAPI_CALL1(*) +SBNSearchDiskTreeInteger( SBNSearchHandle hSBN, + int bMinX, int bMinY, int bMaxX, int bMaxY, + int *pnShapeCount ); + +void SHPAPI_CALL SBNSearchFreeIds( int* panShapeId ); + +/************************************************************************/ +/* DBF Support. */ +/************************************************************************/ +typedef struct +{ + SAHooks sHooks; + + SAFile fp; + + int nRecords; + + int nRecordLength; /* Must fit on uint16 */ + int nHeaderLength; /* File header length (32) + field + descriptor length + spare space. + Must fit on uint16 */ + int nFields; + int *panFieldOffset; + int *panFieldSize; + int *panFieldDecimals; + char *pachFieldType; + + char *pszHeader; /* Field descriptors */ + + int nCurrentRecord; + int bCurrentRecordModified; + char *pszCurrentRecord; + + int nWorkFieldLength; + char *pszWorkField; + + int bNoHeader; + int bUpdated; + + union + { + double dfDoubleField; + int nIntField; + } fieldValue; + + int iLanguageDriver; + char *pszCodePage; + + int nUpdateYearSince1900; /* 0-255 */ + int nUpdateMonth; /* 1-12 */ + int nUpdateDay; /* 1-31 */ + + int bWriteEndOfFileChar; /* defaults to TRUE */ +} DBFInfo; + +typedef DBFInfo * DBFHandle; + +typedef enum { + FTString, + FTInteger, + FTDouble, + FTLogical, + FTDate, + FTInvalid +} DBFFieldType; + +/* Field descriptor/header size */ +#define XBASE_FLDHDR_SZ 32 +/* Shapelib read up to 11 characters, even if only 10 should normally be used */ +#define XBASE_FLDNAME_LEN_READ 11 +/* On writing, we limit to 10 characters */ +#define XBASE_FLDNAME_LEN_WRITE 10 +/* Normally only 254 characters should be used. We tolerate 255 historically */ +#define XBASE_FLD_MAX_WIDTH 255 + +DBFHandle SHPAPI_CALL + DBFOpen( const char * pszDBFFile, const char * pszAccess ); +DBFHandle SHPAPI_CALL + DBFOpenLL( const char * pszDBFFile, const char * pszAccess, + SAHooks *psHooks ); +DBFHandle SHPAPI_CALL + DBFCreate( const char * pszDBFFile ); +DBFHandle SHPAPI_CALL + DBFCreateEx( const char * pszDBFFile, const char * pszCodePage ); +DBFHandle SHPAPI_CALL + DBFCreateLL( const char * pszDBFFile, const char * pszCodePage, SAHooks *psHooks ); + +int SHPAPI_CALL + DBFGetFieldCount( DBFHandle psDBF ); +int SHPAPI_CALL + DBFGetRecordCount( DBFHandle psDBF ); +int SHPAPI_CALL + DBFAddField( DBFHandle hDBF, const char * pszFieldName, + DBFFieldType eType, int nWidth, int nDecimals ); + +int SHPAPI_CALL + DBFAddNativeFieldType( DBFHandle hDBF, const char * pszFieldName, + char chType, int nWidth, int nDecimals ); + +int SHPAPI_CALL + DBFDeleteField( DBFHandle hDBF, int iField ); + +int SHPAPI_CALL + DBFReorderFields( DBFHandle psDBF, int* panMap ); + +int SHPAPI_CALL + DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName, + char chType, int nWidth, int nDecimals ); + +DBFFieldType SHPAPI_CALL + DBFGetFieldInfo( DBFHandle psDBF, int iField, + char * pszFieldName, int * pnWidth, int * pnDecimals ); + +int SHPAPI_CALL + DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName); + +int SHPAPI_CALL + DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField ); +double SHPAPI_CALL + DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField ); +const char SHPAPI_CALL1(*) + DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField ); +const char SHPAPI_CALL1(*) + DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField ); +int SHPAPI_CALL + DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField ); + +int SHPAPI_CALL + DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField, + int nFieldValue ); +int SHPAPI_CALL + DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField, + double dFieldValue ); +int SHPAPI_CALL + DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField, + const char * pszFieldValue ); +int SHPAPI_CALL + DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField ); + +int SHPAPI_CALL + DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField, + const char lFieldValue); +int SHPAPI_CALL + DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, + void * pValue ); +const char SHPAPI_CALL1(*) + DBFReadTuple(DBFHandle psDBF, int hEntity ); +int SHPAPI_CALL + DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ); + +int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ); +int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, + int bIsDeleted ); + +DBFHandle SHPAPI_CALL + DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ); + +void SHPAPI_CALL + DBFClose( DBFHandle hDBF ); +void SHPAPI_CALL + DBFUpdateHeader( DBFHandle hDBF ); +char SHPAPI_CALL + DBFGetNativeFieldType( DBFHandle hDBF, int iField ); + +const char SHPAPI_CALL1(*) + DBFGetCodePage(DBFHandle psDBF ); + +void SHPAPI_CALL + DBFSetLastModifiedDate( DBFHandle psDBF, int nYYSince1900, int nMM, int nDD ); + +void SHPAPI_CALL DBFSetWriteEndOfFileChar( DBFHandle psDBF, int bWriteFlag ); + +#ifdef __cplusplus +} +#endif + +#endif /* ndef SHAPEFILE_H_INCLUDED */ diff --git a/support/include/spatialindex/SpatialIndex.h b/support/include/spatialindex/SpatialIndex.h index f3d20dd5..9e9569b2 100644 --- a/support/include/spatialindex/SpatialIndex.h +++ b/support/include/spatialindex/SpatialIndex.h @@ -158,6 +158,7 @@ namespace SpatialIndex virtual void loadByteArray(const id_type id, uint32_t& len, byte** data) = 0; virtual void storeByteArray(id_type& id, const uint32_t len, const byte* const data) = 0; virtual void deleteByteArray(const id_type id) = 0; + virtual void flush() = 0; virtual ~IStorageManager() {} }; // IStorageManager @@ -203,6 +204,7 @@ namespace SpatialIndex virtual void addCommand(ICommand* in, CommandType ct) = 0; virtual bool isIndexValid() = 0; virtual void getStatistics(IStatistics** out) const = 0; + virtual void flush() = 0; virtual ~ISpatialIndex() {} }; // ISpatialIndex diff --git a/support/include/spatialindex/TPRTree.h b/support/include/spatialindex/TPRTree.h index 35952731..99f6ecf4 100644 --- a/support/include/spatialindex/TPRTree.h +++ b/support/include/spatialindex/TPRTree.h @@ -5,7 +5,7 @@ * Copyright (c) 2003, Marios Hadjieleftheriou * * 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 @@ -34,7 +34,7 @@ namespace SpatialIndex { enum TPRTreeVariant { - TPRV_RSTAR = 0x0 + TPRV_RSTAR = 0x2 }; enum PersistenObjectIdentifier diff --git a/support/include/spatialindex/Version.h b/support/include/spatialindex/Version.h index 60520e98..d181005d 100644 --- a/support/include/spatialindex/Version.h +++ b/support/include/spatialindex/Version.h @@ -5,7 +5,7 @@ * Copyright (c) 2003, Marios Hadjieleftheriou * * 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 @@ -29,8 +29,8 @@ #ifndef SIDX_VERSION_MAJOR #define SIDX_VERSION_MAJOR 1 -#define SIDX_VERSION_MINOR 8 -#define SIDX_VERSION_REV 1 +#define SIDX_VERSION_MINOR 9 +#define SIDX_VERSION_REV 0 #define SIDX_VERSION_BUILD 0 #endif @@ -39,10 +39,10 @@ #endif #ifndef SIDX_RELEASE_DATE -#define SIDX_RELEASE_DATE 20130626 +#define SIDX_RELEASE_DATE 20170302 #endif #ifndef SIDX_RELEASE_NAME -#define SIDX_RELEASE_NAME "1.8.1" +#define SIDX_RELEASE_NAME "1.9.0" #endif diff --git a/support/include/spatialindex/capi/BoundsQuery.h b/support/include/spatialindex/capi/BoundsQuery.h index b0eeda7c..4a003e94 100644 --- a/support/include/spatialindex/capi/BoundsQuery.h +++ b/support/include/spatialindex/capi/BoundsQuery.h @@ -28,6 +28,8 @@ #pragma once + + class BoundsQuery : public SpatialIndex::IQueryStrategy { private: diff --git a/support/include/spatialindex/capi/CountVisitor.h b/support/include/spatialindex/capi/CountVisitor.h index bf4e8c1a..876c07c4 100644 --- a/support/include/spatialindex/capi/CountVisitor.h +++ b/support/include/spatialindex/capi/CountVisitor.h @@ -28,6 +28,8 @@ #pragma once + + class CountVisitor : public SpatialIndex::IVisitor { private: diff --git a/support/include/spatialindex/capi/CustomStorage.h b/support/include/spatialindex/capi/CustomStorage.h index 77a46121..1d775056 100644 --- a/support/include/spatialindex/capi/CustomStorage.h +++ b/support/include/spatialindex/capi/CustomStorage.h @@ -28,6 +28,8 @@ #pragma once + + namespace SpatialIndex { namespace StorageManager diff --git a/support/include/spatialindex/capi/DataStream.h b/support/include/spatialindex/capi/DataStream.h index 3425bfe2..4dc72fdb 100644 --- a/support/include/spatialindex/capi/DataStream.h +++ b/support/include/spatialindex/capi/DataStream.h @@ -6,7 +6,7 @@ * Copyright (c) 2009, Howard Butler * * 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 @@ -25,28 +25,30 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ******************************************************************************/ - + #pragma once + + class DataStream : public SpatialIndex::IDataStream { public: - DataStream(int (*readNext)(SpatialIndex::id_type* id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, uint32_t *nDataLength)); + DataStream(int (*readNext)(SpatialIndex::id_type* id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, size_t *nDataLength)); ~DataStream(); SpatialIndex::IData* getNext(); - bool hasNext() throw (Tools::NotSupportedException); + bool hasNext(); - uint32_t size() throw (Tools::NotSupportedException); - void rewind() throw (Tools::NotSupportedException); + uint32_t size(); + void rewind(); protected: SpatialIndex::RTree::Data* m_pNext; SpatialIndex::id_type m_id; private: - int (*iterfunct)(SpatialIndex::id_type *id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, uint32_t *nDataLength); - + int (*iterfunct)(SpatialIndex::id_type *id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, size_t *nDataLength); + bool readData(); bool m_bDoneReading; diff --git a/support/include/spatialindex/capi/Error.h b/support/include/spatialindex/capi/Error.h index 1675fff7..ccff7ad1 100644 --- a/support/include/spatialindex/capi/Error.h +++ b/support/include/spatialindex/capi/Error.h @@ -28,6 +28,8 @@ #pragma once + + class Error { public: diff --git a/support/include/spatialindex/capi/IdVisitor.h b/support/include/spatialindex/capi/IdVisitor.h index 723791c8..8d326a5c 100644 --- a/support/include/spatialindex/capi/IdVisitor.h +++ b/support/include/spatialindex/capi/IdVisitor.h @@ -28,6 +28,8 @@ #pragma once + + class IdVisitor : public SpatialIndex::IVisitor { private: diff --git a/support/include/spatialindex/capi/Index.h b/support/include/spatialindex/capi/Index.h index f0e9c90a..38840332 100644 --- a/support/include/spatialindex/capi/Index.h +++ b/support/include/spatialindex/capi/Index.h @@ -6,7 +6,7 @@ * Copyright (c) 2009, Howard Butler * * 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 @@ -28,39 +28,51 @@ #pragma once + + class Index { public: Index(const Tools::PropertySet& poProperties); - Index(const Tools::PropertySet& poProperties, int (*readNext)(SpatialIndex::id_type *id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, uint32_t *nDataLength)); + Index(const Tools::PropertySet& poProperties, int (*readNext)(SpatialIndex::id_type *id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, size_t* nDataLength)); ~Index(); - const Tools::PropertySet& GetProperties() { return m_properties; } + const Tools::PropertySet GetProperties() { index().getIndexProperties(m_properties); return m_properties;} bool insertFeature(uint64_t id, double *min, double *max); - + RTIndexType GetIndexType(); void SetIndexType(RTIndexType v); RTStorageType GetIndexStorage(); void SetIndexStorage(RTStorageType v); - + RTIndexVariant GetIndexVariant(); void SetIndexVariant(RTStorageType v); - + + int64_t GetResultSetOffset(); + void SetResultSetOffset(int64_t v); + + int64_t GetResultSetLimit(); + void SetResultSetLimit(int64_t v); + + void flush(); + SpatialIndex::ISpatialIndex& index() {return *m_rtree;} SpatialIndex::StorageManager::IBuffer& buffer() {return *m_buffer;} private: + Index& operator=(const Index&); + Index(); + void Initialize(); SpatialIndex::IStorageManager* m_storage; SpatialIndex::StorageManager::IBuffer* m_buffer; SpatialIndex::ISpatialIndex* m_rtree; - - Tools::PropertySet m_properties; + Tools::PropertySet m_properties; void Setup(); SpatialIndex::IStorageManager* CreateStorage(); diff --git a/support/include/spatialindex/capi/LeafQuery.h b/support/include/spatialindex/capi/LeafQuery.h index 008f09a7..0513842a 100644 --- a/support/include/spatialindex/capi/LeafQuery.h +++ b/support/include/spatialindex/capi/LeafQuery.h @@ -28,6 +28,8 @@ #pragma once + + class LeafQueryResult; class LeafQuery : public SpatialIndex::IQueryStrategy @@ -50,10 +52,10 @@ class LeafQueryResult private: std::vector ids; SpatialIndex::Region* bounds; - uint32_t m_id; + SpatialIndex::id_type m_id; LeafQueryResult(); public: - LeafQueryResult(uint32_t id) : bounds(0), m_id(id){} + LeafQueryResult(SpatialIndex::id_type id) : bounds(0), m_id(id){} ~LeafQueryResult() {if (bounds!=0) delete bounds;} /// Copy constructor. @@ -66,6 +68,6 @@ class LeafQueryResult void SetIDs(std::vector& v); const SpatialIndex::Region* GetBounds() const; void SetBounds(const SpatialIndex::Region* b); - uint32_t getIdentifier() const {return m_id;} + SpatialIndex::id_type getIdentifier() const {return m_id;} void setIdentifier(uint32_t v) {m_id = v;} }; diff --git a/support/include/spatialindex/capi/ObjVisitor.h b/support/include/spatialindex/capi/ObjVisitor.h index 23234d91..d92193bb 100644 --- a/support/include/spatialindex/capi/ObjVisitor.h +++ b/support/include/spatialindex/capi/ObjVisitor.h @@ -28,6 +28,8 @@ #pragma once + + class ObjVisitor : public SpatialIndex::IVisitor { private: @@ -39,7 +41,7 @@ class ObjVisitor : public SpatialIndex::IVisitor ObjVisitor(); ~ObjVisitor(); - uint32_t GetResultCount() const { return nResults; } + uint64_t GetResultCount() const { return nResults; } std::vector& GetResults() { return m_vector; } void visitNode(const SpatialIndex::INode& n); diff --git a/support/include/spatialindex/capi/Utility.h b/support/include/spatialindex/capi/Utility.h index 2b82d02b..00552ac3 100644 --- a/support/include/spatialindex/capi/Utility.h +++ b/support/include/spatialindex/capi/Utility.h @@ -6,7 +6,7 @@ * Copyright (c) 2009, Howard Butler * * 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 @@ -26,7 +26,13 @@ * DEALINGS IN THE SOFTWARE. ******************************************************************************/ +#include "ObjVisitor.h" +#include "IdVisitor.h" + #pragma once Tools::PropertySet* GetDefaults(); + +void Page_ResultSet_Ids(IdVisitor& visitor, int64_t** ids, int64_t nStart, int64_t nResultLimit, uint64_t* nResults); +void Page_ResultSet_Obj(ObjVisitor& visitor, IndexItemH** items, int64_t nStart, int64_t nResultLimit, uint64_t* nResults); diff --git a/support/include/spatialindex/capi/sidx_api.h b/support/include/spatialindex/capi/sidx_api.h index 0169ef5b..ee1a4e47 100644 --- a/support/include/spatialindex/capi/sidx_api.h +++ b/support/include/spatialindex/capi/sidx_api.h @@ -6,7 +6,7 @@ * Copyright (c) 2009, Howard Butler * * 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 @@ -44,53 +44,194 @@ IndexH Index_CreateWithStream( IndexPropertyH properties, void Index_Destroy(IndexH index); IndexPropertyH Index_GetProperties(IndexH index); -RTError Index_DeleteData( IndexH index, - int64_t id, - double* pdMin, - double* pdMax, +RTError Index_DeleteData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, uint32_t nDimension); - -RTError Index_InsertData( IndexH index, - int64_t id, - double* pdMin, - double* pdMax, - uint32_t nDimension, - const uint8_t* pData, + +SIDX_C_DLL RTError Index_DeleteTPData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension + ); + +SIDX_C_DLL RTError Index_DeleteMVRData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension + ); + +RTError Index_InsertData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, + uint32_t nDimension, + const uint8_t* pData, size_t nDataLength); - + +SIDX_C_DLL RTError Index_InsertTPData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + const uint8_t* pData, + size_t nDataLength); + +SIDX_C_DLL RTError Index_InsertMVRData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + const uint8_t* pData, + size_t nDataLength); + uint32_t Index_IsValid(IndexH index); -RTError Index_Intersects_obj( IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - IndexItemH** items, +SIDX_C_DLL RTError Index_TPIntersects_obj( IndexH index, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + IndexItemH** items, + uint64_t* nResults); + +SIDX_C_DLL RTError Index_MVRIntersects_obj( IndexH index, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + IndexItemH** items, + uint64_t* nResults); + +RTError Index_Intersects_obj( IndexH index, + double* pdMin, + double* pdMax, + uint32_t nDimension, + IndexItemH** items, uint64_t* nResults); -RTError Index_Intersects_id( IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - int64_t** items, +SIDX_C_DLL RTError Index_TPIntersects_id( IndexH index, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + int64_t** ids, + uint64_t* nResults); + +SIDX_C_DLL RTError Index_MVRIntersects_id( IndexH index, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + int64_t** ids, uint64_t* nResults); - -RTError Index_Intersects_count( IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, + +RTError Index_Intersects_id( IndexH index, + double* pdMin, + double* pdMax, + uint32_t nDimension, + int64_t** items, + uint64_t* nResults); + +SIDX_C_DLL RTError Index_TPIntersects_count( IndexH index, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + uint64_t* nResults); + +SIDX_C_DLL RTError Index_MVRIntersects_count( IndexH index, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + uint64_t* nResults); + +RTError Index_Intersects_count( IndexH index, + double* pdMin, + double* pdMax, + uint32_t nDimension, uint64_t* nResults); -RTError Index_NearestNeighbors_obj(IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - IndexItemH** items, + +SIDX_C_DLL RTError Index_TPNearestNeighbors_obj(IndexH index, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + IndexItemH** items, + uint64_t* nResults); + +SIDX_C_DLL RTError Index_MVRNearestNeighbors_obj(IndexH index, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + IndexItemH** items, + uint64_t* nResults); + +RTError Index_NearestNeighbors_obj(IndexH index, + double* pdMin, + double* pdMax, + uint32_t nDimension, + IndexItemH** items, + uint64_t* nResults); + +SIDX_C_DLL RTError Index_TPNearestNeighbors_id(IndexH index, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + int64_t** ids, + uint64_t* nResults); + +SIDX_C_DLL RTError Index_MVRNearestNeighbors_id(IndexH index, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + int64_t** ids, uint64_t* nResults); -RTError Index_NearestNeighbors_id( IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - int64_t** items, +RTError Index_NearestNeighbors_id( IndexH index, + double* pdMin, + double* pdMax, + uint32_t nDimension, + int64_t** items, uint64_t* nResults); RTError Index_GetBounds( IndexH index, @@ -99,18 +240,25 @@ RTError Index_GetBounds( IndexH index, uint32_t* nDimension); -SIDX_C_DLL RTError Index_GetLeaves( IndexH index, +SIDX_C_DLL RTError Index_GetLeaves( IndexH index, uint32_t* nLeafNodes, - uint32_t** nLeafSizes, - int64_t** nLeafIDs, + uint32_t** nLeafSizes, + int64_t** nLeafIDs, int64_t*** nLeafChildIDs, - double*** pppdMin, - double*** pppdMax, + double*** pppdMin, + double*** pppdMax, uint32_t* nDimension); +RTError Index_SetResultSetOffset(IndexH index, int64_t value); +int64_t Index_GetResultSetOffset(IndexH index); + +RTError Index_SetResultSetLimit(IndexH index, int64_t value); +int64_t Index_GetResultSetLimit(IndexH index); + void Index_DestroyObjResults(IndexItemH* results, uint32_t nResults); void Index_ClearBuffer(IndexH index); void Index_Free(void* object); +void Index_Flush(IndexH index); void IndexItem_Destroy(IndexItemH item); int64_t IndexItem_GetID(IndexItemH item); @@ -121,7 +269,7 @@ RTError IndexItem_GetBounds( IndexItemH item, double** ppdMin, double** ppdMax, uint32_t* nDimension); - + IndexPropertyH IndexProperty_Create(); void IndexProperty_Destroy(IndexPropertyH hProp); @@ -206,8 +354,13 @@ int64_t IndexProperty_GetIndexID(IndexPropertyH iprop); SIDX_C_DLL void* SIDX_NewBuffer(size_t bytes); SIDX_C_DLL void SIDX_DeleteBuffer(void* buffer); +RTError IndexProperty_SetResultSetLimit(IndexPropertyH iprop, uint64_t value); +uint64_t IndexProperty_GetResultSetLimit(IndexPropertyH iprop); + SIDX_C_DLL char* SIDX_Version(); +SIDX_C_DLL char* Error_GetLastErrorMsg(void); + IDX_C_END -#endif \ No newline at end of file +#endif diff --git a/support/include/spatialindex/capi/sidx_config.h b/support/include/spatialindex/capi/sidx_config.h index 1bf32bdb..cebe8cdc 100644 --- a/support/include/spatialindex/capi/sidx_config.h +++ b/support/include/spatialindex/capi/sidx_config.h @@ -6,7 +6,7 @@ * Copyright (c) 2009, Howard Butler * * 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 @@ -61,9 +61,6 @@ -class Item; -class Index; - typedef enum { RT_None = 0, @@ -106,21 +103,10 @@ typedef enum # define IDX_C_END #endif -typedef Index *IndexH; -typedef SpatialIndex::IData *IndexItemH; -typedef Tools::PropertySet *IndexPropertyH; +typedef struct IndexS *IndexH; +typedef struct SpatialIndex_IData *IndexItemH; +typedef struct Tools_PropertySet *IndexPropertyH; -#ifndef SIDX_C_DLL -#if defined(_MSC_VER) -# define SIDX_C_DLL __declspec(dllexport) -#else -# if defined(USE_GCC_VISIBILITY_FLAG) -# define SIDX_C_DLL __attribute__ ((visibility("default"))) -# else -# define SIDX_C_DLL -# endif -#endif -#endif #endif diff --git a/support/spatialindex/include/spatialindex/capi/Utility.h b/support/include/spatialindex/capi/sidx_export.h similarity index 79% rename from support/spatialindex/include/spatialindex/capi/Utility.h rename to support/include/spatialindex/capi/sidx_export.h index 2b82d02b..af237f37 100644 --- a/support/spatialindex/include/spatialindex/capi/Utility.h +++ b/support/include/spatialindex/capi/sidx_export.h @@ -3,7 +3,7 @@ * Purpose: C++ object declarations to implement utilities. * Author: Howard Butler, hobu.inc@gmail.com ****************************************************************************** - * Copyright (c) 2009, Howard Butler + * Copyright (c) 2014, Howard Butler * * All rights reserved. * @@ -26,7 +26,19 @@ * DEALINGS IN THE SOFTWARE. ******************************************************************************/ - #pragma once -Tools::PropertySet* GetDefaults(); +#ifndef SIDX_C_DLL +#if defined(_MSC_VER) +# define SIDX_C_DLL __declspec(dllexport) +# define __declspec(dllexport) +#else +# if defined(USE_GCC_VISIBILITY_FLAG) +# define SIDX_C_DLL __attribute__ ((visibility("default"))) +# define __attribute__ ((visibility("default"))) +# else +# define SIDX_C_DLL +# define SIDX_DLL +# endif +#endif +#endif diff --git a/support/include/spatialindex/capi/sidx_impl.h b/support/include/spatialindex/capi/sidx_impl.h index a52c5654..df665b9f 100644 --- a/support/include/spatialindex/capi/sidx_impl.h +++ b/support/include/spatialindex/capi/sidx_impl.h @@ -33,6 +33,7 @@ #include #include +#include "../SpatialIndex.h" #include "sidx_config.h" #include "Utility.h" #include "ObjVisitor.h" diff --git a/support/include/spatialindex/tools/Tools.h b/support/include/spatialindex/tools/Tools.h index 32a9801e..d84267b0 100644 --- a/support/include/spatialindex/tools/Tools.h +++ b/support/include/spatialindex/tools/Tools.h @@ -5,7 +5,7 @@ * Copyright (c) 2004, Marios Hadjieleftheriou * * 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 @@ -28,7 +28,7 @@ #pragma once -#if (defined _WIN32 || defined _WIN64 || defined WIN32 || defined WIN64) && !defined __GNUC__ +#if (defined(_MSC_VER) && _MSC_VER < 1600) && !defined __GNUC__ typedef __int8 int8_t; typedef __int16 int16_t; typedef __int32 int32_t; @@ -38,13 +38,13 @@ typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; -// Nuke this annoying warning. See http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html -#pragma warning( disable: 4251 ) - #else #include #endif + // Nuke this annoying warning. See http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html +#pragma warning( disable: 4251 ) + #include #include #include @@ -59,9 +59,7 @@ #include #include #include -// #include -// #include -// #include +#include #if HAVE_PTHREAD_H #include @@ -100,8 +98,9 @@ namespace Tools VT_PVOID, VT_EMPTY, VT_LONGLONG, - VT_ULONGLONG - }; + VT_ULONGLONG, + VT_PWCHAR + }; enum FileMode { @@ -288,6 +287,7 @@ namespace Tools bool blVal; // VT_BOOL char* pcVal; // VT_PCHAR void* pvVal; // VT_PVOID + wchar_t* pwcVal; } m_val; }; // Variant @@ -301,8 +301,8 @@ namespace Tools PropertySet(const byte* data); virtual ~PropertySet(); - Variant getProperty(std::string property); - void setProperty(std::string property, Variant& v); + Variant getProperty(std::string property) const; + void setProperty(std::string property, Variant const& v); void removeProperty(std::string property); virtual uint32_t getByteArraySize(); @@ -311,11 +311,11 @@ namespace Tools private: std::map m_propertySet; -#ifdef HAVE_PTHREAD_H - pthread_rwlock_t m_rwLock; -#else - bool m_rwLock; -#endif +// #ifdef HAVE_PTHREAD_H +// pthread_rwlock_t m_rwLock; +// #else +// bool m_rwLock; +// #endif friend std::ostream& Tools::operator<<(std::ostream& os, const Tools::PropertySet& p); }; // PropertySet diff --git a/support/lib/v100/Win32/cqlib.lib b/support/lib/v100/Win32/cqlib.lib deleted file mode 100644 index 3d3d63d1..00000000 Binary files a/support/lib/v100/Win32/cqlib.lib and /dev/null differ diff --git a/support/lib/v100/Win32/spatialindex-mw.lib b/support/lib/v100/Win32/spatialindex-mw.lib deleted file mode 100644 index de3f243e..00000000 Binary files a/support/lib/v100/Win32/spatialindex-mw.lib and /dev/null differ diff --git a/support/lib/v100/x64/cqlib.lib b/support/lib/v100/x64/cqlib.lib deleted file mode 100644 index 817db707..00000000 Binary files a/support/lib/v100/x64/cqlib.lib and /dev/null differ diff --git a/support/lib/v120/Win32/cqlib.lib b/support/lib/v120/Win32/cqlib.lib index 77e5a40d..b8883f43 100644 Binary files a/support/lib/v120/Win32/cqlib.lib and b/support/lib/v120/Win32/cqlib.lib differ diff --git a/support/lib/v120/Win32/shapelib.lib b/support/lib/v120/Win32/shapelib.lib new file mode 100644 index 00000000..9c91524f Binary files /dev/null and b/support/lib/v120/Win32/shapelib.lib differ diff --git a/support/lib/v120/Win32/spatialindex-mw.lib b/support/lib/v120/Win32/spatialindex-mw.lib index 00971d6e..3f8b9f45 100644 Binary files a/support/lib/v120/Win32/spatialindex-mw.lib and b/support/lib/v120/Win32/spatialindex-mw.lib differ diff --git a/support/lib/v120/x64/cqlib.lib b/support/lib/v120/x64/cqlib.lib index 278d9a92..b638e913 100644 Binary files a/support/lib/v120/x64/cqlib.lib and b/support/lib/v120/x64/cqlib.lib differ diff --git a/support/lib/v120/x64/spatialindex-mw.lib b/support/lib/v120/x64/spatialindex-mw.lib index 6c0c5b14..4561c216 100644 Binary files a/support/lib/v120/x64/spatialindex-mw.lib and b/support/lib/v120/x64/spatialindex-mw.lib differ diff --git a/support/lib/v90/Win32/cqlib.lib b/support/lib/v90/Win32/cqlib.lib deleted file mode 100644 index e16ac4f4..00000000 Binary files a/support/lib/v90/Win32/cqlib.lib and /dev/null differ diff --git a/support/lib/v90/Win32/spatialindex-mw.lib b/support/lib/v90/Win32/spatialindex-mw.lib deleted file mode 100644 index bceb6ac5..00000000 Binary files a/support/lib/v90/Win32/spatialindex-mw.lib and /dev/null differ diff --git a/support/lib/v90/x64/cqlib.lib b/support/lib/v90/x64/cqlib.lib deleted file mode 100644 index d430347c..00000000 Binary files a/support/lib/v90/x64/cqlib.lib and /dev/null differ diff --git a/support/lib/v90/x64/spatialindex-mw.lib b/support/lib/v90/x64/spatialindex-mw.lib deleted file mode 100644 index 4f74c695..00000000 Binary files a/support/lib/v90/x64/spatialindex-mw.lib and /dev/null differ diff --git a/support/spatialindex/README b/support/spatialindex/README index d71433c2..6687ef32 100644 --- a/support/spatialindex/README +++ b/support/spatialindex/README @@ -4,7 +4,7 @@ :Author: Marios Hadjieleftheriou :Contact: mhadji@gmail.com -:Revision: 1.8.1 -:Date: 06/26/2013 +:Revision: 1.8.6 +:Date: 02/24/2016 -See http://libspatialindex.org for full documentation. \ No newline at end of file +See http://libspatialindex.org for full documentation. diff --git a/support/spatialindex/include/Makefile.am b/support/spatialindex/include/Makefile.am deleted file mode 100644 index d093aacd..00000000 --- a/support/spatialindex/include/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -spatialindexdir = $(includedir) - -nobase_spatialindex_HEADERS = spatialindex/SpatialIndex.h \ - spatialindex/RTree.h \ - spatialindex/MVRTree.h \ - spatialindex/TPRTree.h \ - spatialindex/Point.h \ - spatialindex/Region.h \ - spatialindex/LineSegment.h \ - spatialindex/TimePoint.h \ - spatialindex/TimeRegion.h \ - spatialindex/MovingPoint.h \ - spatialindex/MovingRegion.h \ - spatialindex/Version.h \ - spatialindex/capi/BoundsQuery.h \ - spatialindex/capi/CountVisitor.h \ - spatialindex/capi/CustomStorage.h \ - spatialindex/capi/DataStream.h \ - spatialindex/capi/Error.h \ - spatialindex/capi/IdVisitor.h \ - spatialindex/capi/Index.h \ - spatialindex/capi/LeafQuery.h \ - spatialindex/capi/ObjVisitor.h \ - spatialindex/capi/sidx_api.h \ - spatialindex/capi/sidx_config.h \ - spatialindex/capi/sidx_impl.h \ - spatialindex/capi/Utility.h \ - spatialindex/tools/PointerPool.h \ - spatialindex/tools/PoolPointer.h \ - spatialindex/tools/rand48.h \ - spatialindex/tools/SmartPointer.h \ - spatialindex/tools/Tools.h \ No newline at end of file diff --git a/support/spatialindex/include/Makefile.in b/support/spatialindex/include/Makefile.in deleted file mode 100644 index b7113db1..00000000 --- a/support/spatialindex/include/Makefile.in +++ /dev/null @@ -1,550 +0,0 @@ -# Makefile.in generated by automake 1.13.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2012 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@ -am__make_dryrun = \ - { \ - am__dry=no; \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ - esac; \ - test $$am__dry = yes; \ - } -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@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@ -subdir = include -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/mkinstalldirs $(nobase_spatialindex_HEADERS) -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -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 = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(spatialindexdir)" -HEADERS = $(nobase_spatialindex_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -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@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -spatialindexdir = $(includedir) -nobase_spatialindex_HEADERS = spatialindex/SpatialIndex.h \ - spatialindex/RTree.h \ - spatialindex/MVRTree.h \ - spatialindex/TPRTree.h \ - spatialindex/Point.h \ - spatialindex/Region.h \ - spatialindex/LineSegment.h \ - spatialindex/TimePoint.h \ - spatialindex/TimeRegion.h \ - spatialindex/MovingPoint.h \ - spatialindex/MovingRegion.h \ - spatialindex/Version.h \ - spatialindex/capi/BoundsQuery.h \ - spatialindex/capi/CountVisitor.h \ - spatialindex/capi/CustomStorage.h \ - spatialindex/capi/DataStream.h \ - spatialindex/capi/Error.h \ - spatialindex/capi/IdVisitor.h \ - spatialindex/capi/Index.h \ - spatialindex/capi/LeafQuery.h \ - spatialindex/capi/ObjVisitor.h \ - spatialindex/capi/sidx_api.h \ - spatialindex/capi/sidx_config.h \ - spatialindex/capi/sidx_impl.h \ - spatialindex/capi/Utility.h \ - spatialindex/tools/PointerPool.h \ - spatialindex/tools/PoolPointer.h \ - spatialindex/tools/rand48.h \ - spatialindex/tools/SmartPointer.h \ - spatialindex/tools/Tools.h - -all: 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 ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu 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 -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-nobase_spatialindexHEADERS: $(nobase_spatialindex_HEADERS) - @$(NORMAL_INSTALL) - @list='$(nobase_spatialindex_HEADERS)'; test -n "$(spatialindexdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(spatialindexdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(spatialindexdir)" || exit 1; \ - fi; \ - $(am__nobase_list) | while read dir files; do \ - xfiles=; for file in $$files; do \ - if test -f "$$file"; then xfiles="$$xfiles $$file"; \ - else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ - test -z "$$xfiles" || { \ - test "x$$dir" = x. || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(spatialindexdir)/$$dir'"; \ - $(MKDIR_P) "$(DESTDIR)$(spatialindexdir)/$$dir"; }; \ - echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(spatialindexdir)/$$dir'"; \ - $(INSTALL_HEADER) $$xfiles "$(DESTDIR)$(spatialindexdir)/$$dir" || exit $$?; }; \ - done - -uninstall-nobase_spatialindexHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(nobase_spatialindex_HEADERS)'; test -n "$(spatialindexdir)" || list=; \ - $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ - dir='$(DESTDIR)$(spatialindexdir)'; $(am__uninstall_files_from_dir) - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -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 "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$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) -installdirs: - for dir in "$(DESTDIR)$(spatialindexdir)"; 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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-nobase_spatialindexHEADERS - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -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 mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-nobase_spatialindexHEADERS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool cscopelist-am ctags ctags-am distclean \ - distclean-generic distclean-libtool 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-nobase_spatialindexHEADERS install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-nobase_spatialindexHEADERS - - -# 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/support/spatialindex/include/spatialindex/LineSegment.h b/support/spatialindex/include/spatialindex/LineSegment.h deleted file mode 100644 index 25753abc..00000000 --- a/support/spatialindex/include/spatialindex/LineSegment.h +++ /dev/null @@ -1,103 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2004, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -namespace SpatialIndex -{ - class LineSegment : public Tools::IObject, public virtual IShape - { - public: - LineSegment(); - LineSegment(const double* startPoint, const double* endPoint, uint32_t dimension); - LineSegment(const Point& startPoint, const Point& endPoint); - LineSegment(const LineSegment& l); - virtual ~LineSegment(); - - virtual LineSegment& operator=(const LineSegment& p); - virtual bool operator==(const LineSegment& p) const; - - // - // IObject interface - // - virtual LineSegment* clone(); - - // - // ISerializable interface - // - virtual uint32_t getByteArraySize(); - virtual void loadFromByteArray(const byte* data); - virtual void storeToByteArray(byte** data, uint32_t& length); - - // - // IShape interface - // - virtual bool intersectsShape(const IShape& in) const; - virtual bool containsShape(const IShape& in) const; - virtual bool touchesShape(const IShape& in) const; - virtual void getCenter(Point& out) const; - virtual uint32_t getDimension() const; - virtual void getMBR(Region& out) const; - virtual double getArea() const; - virtual double getMinimumDistance(const IShape& in) const; - - virtual bool intersectsLineSegment(const LineSegment& l) const; - virtual bool intersectsRegion(const Region& p) const; - virtual double getMinimumDistance(const Point& p) const; - //virtual double getMinimumDistance(const Region& r) const; - virtual double getRelativeMinimumDistance(const Point& p) const; - virtual double getRelativeMaximumDistance(const Region& r) const; - virtual double getAngleOfPerpendicularRay(); - - virtual void makeInfinite(uint32_t dimension); - virtual void makeDimension(uint32_t dimension); - - public: - uint32_t m_dimension; - double* m_pStartPoint; - double* m_pEndPoint; - - friend class Region; - friend class Point; - friend std::ostream& operator<<(std::ostream& os, const LineSegment& pt); - - protected: - - //some helpers for intersects methods - static double doubleAreaTriangle(const Point& a, const Point& b, const Point& c); - static bool leftOf(const Point& a, const Point& b, const Point& c); - static bool collinear(const Point& a, const Point& b, const Point& c); - static bool between(const Point& a, const Point& b, const Point& c); - static bool between(double a, double b, double c); - static bool intersectsProper(const Point& a, const Point& b, const Point& c, const Point& d); - static bool intersects(const Point& a, const Point& b, const Point& c, const Point& d); - - }; // LineSegment - - std::ostream& operator<<(std::ostream& os, const LineSegment& pt); -} - diff --git a/support/spatialindex/include/spatialindex/MVRTree.h b/support/spatialindex/include/spatialindex/MVRTree.h deleted file mode 100644 index c973c2f6..00000000 --- a/support/spatialindex/include/spatialindex/MVRTree.h +++ /dev/null @@ -1,89 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2004, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -namespace SpatialIndex -{ - namespace MVRTree - { - enum MVRTreeVariant - { - RV_LINEAR = 0x0, - RV_QUADRATIC, - RV_RSTAR - }; - - enum PersistenObjectIdentifier - { - PersistentIndex = 0x1, - PersistentLeaf = 0x2 - }; - - enum RangeQueryType - { - ContainmentQuery = 0x1, - IntersectionQuery = 0x2 - }; - - class Data : public IData, public Tools::ISerializable - { - public: - Data(uint32_t len, byte* pData, TimeRegion& r, id_type id); - virtual ~Data(); - - virtual Data* clone(); - virtual id_type getIdentifier() const; - virtual void getShape(IShape** out) const; - virtual void getData(uint32_t& len, byte** data) const; - virtual uint32_t getByteArraySize(); - virtual void loadFromByteArray(const byte* data); - virtual void storeToByteArray(byte** data, uint32_t& len); - - id_type m_id; - TimeRegion m_region; - byte* m_pData; - uint32_t m_dataLength; - }; // Data - - ISpatialIndex* returnMVRTree(IStorageManager& ind, Tools::PropertySet& in); - ISpatialIndex* createNewMVRTree( - IStorageManager& in, - double fillFactor, - uint32_t indexCapacity, - uint32_t leafCapacity, - uint32_t dimension, - MVRTreeVariant rv, - id_type& out_indexIdentifier - ); - ISpatialIndex* loadMVRTree( - IStorageManager& in, - id_type indexIdentifier - ); - } -} - diff --git a/support/spatialindex/include/spatialindex/MovingPoint.h b/support/spatialindex/include/spatialindex/MovingPoint.h deleted file mode 100644 index 07723501..00000000 --- a/support/spatialindex/include/spatialindex/MovingPoint.h +++ /dev/null @@ -1,85 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2003, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -namespace SpatialIndex -{ - class MovingPoint : public TimePoint, public IEvolvingShape - { - public: - MovingPoint(); - MovingPoint(const double* pCoords, const double* pVCoords, const Tools::IInterval& ti, uint32_t dimension); - MovingPoint(const double* pCoords, const double* pVCoords, double tStart, double tEnd, uint32_t dimension); - MovingPoint(const Point& p, const Point& vp, const Tools::IInterval& ti); - MovingPoint(const Point& p, const Point& vp, double tStart, double tEnd); - MovingPoint(const MovingPoint& p); - virtual ~MovingPoint(); - - virtual MovingPoint& operator=(const MovingPoint& p); - virtual bool operator==(const MovingPoint& p) const; - - virtual double getCoord(uint32_t index, double t) const; - virtual double getProjectedCoord(uint32_t index, double t) const; - virtual double getVCoord(uint32_t index) const; - virtual void getPointAtTime(double t, Point& out) const; - - // - // IObject interface - // - virtual MovingPoint* clone(); - - // - // ISerializable interface - // - virtual uint32_t getByteArraySize(); - virtual void loadFromByteArray(const byte* data); - virtual void storeToByteArray(byte** data, uint32_t& len); - - // - // IEvolvingShape interface - // - virtual void getVMBR(Region& out) const; - virtual void getMBRAtTime(double t, Region& out) const; - - virtual void makeInfinite(uint32_t dimension); - virtual void makeDimension(uint32_t dimension); - - private: - void initialize( - const double* pCoords, const double* pVCoords, - double tStart, double tEnd, uint32_t dimension); - - public: - double* m_pVCoords; - - friend std::ostream& operator<<(std::ostream& os, const MovingPoint& pt); - }; // MovingPoint - - std::ostream& operator<<(std::ostream& os, const MovingPoint& pt); -} - diff --git a/support/spatialindex/include/spatialindex/MovingRegion.h b/support/spatialindex/include/spatialindex/MovingRegion.h deleted file mode 100644 index 7d142d5c..00000000 --- a/support/spatialindex/include/spatialindex/MovingRegion.h +++ /dev/null @@ -1,170 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2003, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -namespace SpatialIndex -{ - class MovingRegion : public TimeRegion, public IEvolvingShape - { - using Region::getLow; - using Region::getHigh; - using TimeRegion::intersectsRegionInTime; - using TimeRegion::containsRegionInTime; - using TimeRegion::combineRegionInTime; - using TimeRegion::getCombinedRegionInTime; - using TimeRegion::containsPointInTime; - - public: - MovingRegion(); - MovingRegion( - const double* pLow, const double* pHigh, - const double* pVLow, const double* pVHigh, - const Tools::IInterval& ti, uint32_t dimension); - MovingRegion( - const double* pLow, const double* pHigh, - const double* pVLow, const double* pVHigh, - double tStart, double tEnd, uint32_t dimension); - MovingRegion( - const Point& low, const Point& high, - const Point& vlow, const Point& vhigh, - const Tools::IInterval& ti); - MovingRegion( - const Point& low, const Point& high, - const Point& vlow, const Point& vhigh, - double tStart, double tEnd); - MovingRegion(const Region& mbr, const Region& vbr, const Tools::IInterval& ivI); - MovingRegion(const Region& mbr, const Region& vbr, double tStart, double tEnd); - MovingRegion(const MovingPoint& low, const MovingPoint& high); - MovingRegion(const MovingRegion& in); - virtual ~MovingRegion(); - - virtual MovingRegion& operator=(const MovingRegion& r); - virtual bool operator==(const MovingRegion&) const; - - bool isShrinking() const; - - virtual double getLow(uint32_t index, double t) const; - virtual double getHigh(uint32_t index, double t) const; - virtual double getExtrapolatedLow(uint32_t index, double t) const; - virtual double getExtrapolatedHigh(uint32_t index, double t) const; - virtual double getVLow(uint32_t index) const; - virtual double getVHigh(uint32_t index) const; - - virtual bool intersectsRegionInTime(const MovingRegion& r) const; - virtual bool intersectsRegionInTime(const MovingRegion& r, Tools::IInterval& out) const; - virtual bool intersectsRegionInTime(const Tools::IInterval& ivI, const MovingRegion& r, Tools::IInterval& ret) const; - virtual bool containsRegionInTime(const MovingRegion& r) const; - virtual bool containsRegionInTime(const Tools::IInterval& ivI, const MovingRegion& r) const; - virtual bool containsRegionAfterTime(double t, const MovingRegion& r) const; - - virtual double getProjectedSurfaceAreaInTime() const; - virtual double getProjectedSurfaceAreaInTime(const Tools::IInterval& ivI) const; - - virtual double getCenterDistanceInTime(const MovingRegion& r) const; - virtual double getCenterDistanceInTime(const Tools::IInterval& ivI, const MovingRegion& r) const; - - virtual bool intersectsRegionAtTime(double t, const MovingRegion& r) const; - virtual bool containsRegionAtTime(double t, const MovingRegion& r) const; - - virtual bool intersectsPointInTime(const MovingPoint& p) const; - virtual bool intersectsPointInTime(const MovingPoint& p, Tools::IInterval& out) const; - virtual bool intersectsPointInTime(const Tools::IInterval& ivI, const MovingPoint& p, Tools::IInterval& out) const; - virtual bool containsPointInTime(const MovingPoint& p) const; - virtual bool containsPointInTime(const Tools::IInterval& ivI, const MovingPoint& p) const; - - //virtual bool intersectsPointAtTime(double t, const MovingRegion& in) const; - //virtual bool containsPointAtTime(double t, const MovingRegion& in) const; - - virtual void combineRegionInTime(const MovingRegion& r); - virtual void combineRegionAfterTime(double t, const MovingRegion& r); - virtual void getCombinedRegionInTime(MovingRegion& out, const MovingRegion& in) const; - virtual void getCombinedRegionAfterTime(double t, MovingRegion& out, const MovingRegion& in) const; - - virtual double getIntersectingAreaInTime(const MovingRegion& r) const; - virtual double getIntersectingAreaInTime(const Tools::IInterval& ivI, const MovingRegion& r) const; - - // - // IObject interface - // - virtual MovingRegion* clone(); - - // - // ISerializable interface - // - virtual uint32_t getByteArraySize(); - virtual void loadFromByteArray(const byte* data); - virtual void storeToByteArray(byte** data, uint32_t& len); - - // - // IEvolvingShape interface - // - virtual void getVMBR(Region& out) const; - virtual void getMBRAtTime(double t, Region& out) const; - - // - // ITimeShape interface - // - virtual double getAreaInTime() const; - virtual double getAreaInTime(const Tools::IInterval& ivI) const; - virtual double getIntersectingAreaInTime(const ITimeShape& r) const; - virtual double getIntersectingAreaInTime(const Tools::IInterval& ivI, const ITimeShape& r) const; - - virtual void makeInfinite(uint32_t dimension); - virtual void makeDimension(uint32_t dimension); - - private: - void initialize( - const double* pLow, const double* pHigh, - const double* pVLow, const double* pVHigh, - double tStart, double tEnd, uint32_t dimension); - - public: - class CrossPoint - { - public: - double m_t; - uint32_t m_dimension; - uint32_t m_boundary; - const MovingRegion* m_to; - - struct ascending: public std::binary_function - { - bool operator()(const CrossPoint& __x, const CrossPoint& __y) const { return __x.m_t > __y.m_t; } - }; - }; // CrossPoint - - public: - double* m_pVLow; - double* m_pVHigh; - - friend std::ostream& operator<<(std::ostream& os, const MovingRegion& r); - }; // MovingRegion - - typedef Tools::PoolPointer MovingRegionPtr; - std::ostream& operator<<(std::ostream& os, const MovingRegion& r); -} diff --git a/support/spatialindex/include/spatialindex/Point.h b/support/spatialindex/include/spatialindex/Point.h deleted file mode 100644 index f7b0b3cc..00000000 --- a/support/spatialindex/include/spatialindex/Point.h +++ /dev/null @@ -1,87 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2004, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -#include "tools/Tools.h" - -namespace SpatialIndex -{ - class Point : public Tools::IObject, public virtual IShape - { - public: - Point(); - Point(const double* pCoords, uint32_t dimension); - Point(const Point& p); - virtual ~Point(); - - virtual Point& operator=(const Point& p); - virtual bool operator==(const Point& p) const; - - // - // IObject interface - // - virtual Point* clone(); - - // - // ISerializable interface - // - virtual uint32_t getByteArraySize(); - virtual void loadFromByteArray(const byte* data); - virtual void storeToByteArray(byte** data, uint32_t& length); - - // - // IShape interface - // - virtual bool intersectsShape(const IShape& in) const; - virtual bool containsShape(const IShape& in) const; - virtual bool touchesShape(const IShape& in) const; - virtual void getCenter(Point& out) const; - virtual uint32_t getDimension() const; - virtual void getMBR(Region& out) const; - virtual double getArea() const; - virtual double getMinimumDistance(const IShape& in) const; - - virtual double getMinimumDistance(const Point& p) const; - - virtual double getCoordinate(uint32_t index) const; - - virtual void makeInfinite(uint32_t dimension); - virtual void makeDimension(uint32_t dimension); - - public: - uint32_t m_dimension; - double* m_pCoords; - - friend class Region; - friend std::ostream& operator<<(std::ostream& os, const Point& pt); - }; // Point - - typedef Tools::PoolPointer PointPtr; - - std::ostream& operator<<(std::ostream& os, const Point& pt); -} diff --git a/support/spatialindex/include/spatialindex/RTree.h b/support/spatialindex/include/spatialindex/RTree.h deleted file mode 100644 index ea1ca29f..00000000 --- a/support/spatialindex/include/spatialindex/RTree.h +++ /dev/null @@ -1,108 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2004, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -namespace SpatialIndex -{ - namespace RTree - { - enum RTreeVariant - { - RV_LINEAR = 0x0, - RV_QUADRATIC, - RV_RSTAR - }; - - enum BulkLoadMethod - { - BLM_STR = 0x0 - }; - - enum PersistenObjectIdentifier - { - PersistentIndex = 0x1, - PersistentLeaf = 0x2 - }; - - enum RangeQueryType - { - ContainmentQuery = 0x1, - IntersectionQuery = 0x2 - }; - - class Data : public IData, public Tools::ISerializable - { - public: - Data(uint32_t len, byte* pData, Region& r, id_type id); - virtual ~Data(); - - virtual Data* clone(); - virtual id_type getIdentifier() const; - virtual void getShape(IShape** out) const; - virtual void getData(uint32_t& len, byte** data) const; - virtual uint32_t getByteArraySize(); - virtual void loadFromByteArray(const byte* data); - virtual void storeToByteArray(byte** data, uint32_t& len); - - id_type m_id; - Region m_region; - byte* m_pData; - uint32_t m_dataLength; - }; // Data - - ISpatialIndex* returnRTree(IStorageManager& ind, Tools::PropertySet& in); - ISpatialIndex* createNewRTree( - IStorageManager& sm, - double fillFactor, - uint32_t indexCapacity, - uint32_t leafCapacity, - uint32_t dimension, - RTreeVariant rv, - id_type& indexIdentifier - ); - ISpatialIndex* createAndBulkLoadNewRTree( - BulkLoadMethod m, - IDataStream& stream, - IStorageManager& sm, - double fillFactor, - uint32_t indexCapacity, - uint32_t leafCapacity, - uint32_t dimension, - RTreeVariant rv, - id_type& indexIdentifier - ); - ISpatialIndex* createAndBulkLoadNewRTree( - BulkLoadMethod m, - IDataStream& stream, - IStorageManager& sm, - Tools::PropertySet& ps, - id_type& indexIdentifier - ); - ISpatialIndex* loadRTree(IStorageManager& in, id_type indexIdentifier); - } -} diff --git a/support/spatialindex/include/spatialindex/Region.h b/support/spatialindex/include/spatialindex/Region.h deleted file mode 100644 index d587fba3..00000000 --- a/support/spatialindex/include/spatialindex/Region.h +++ /dev/null @@ -1,106 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2004, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -namespace SpatialIndex -{ - class Region : public Tools::IObject, public virtual IShape - { - public: - Region(); - Region(const double* pLow, const double* pHigh, uint32_t dimension); - Region(const Point& low, const Point& high); - Region(const Region& in); - virtual ~Region(); - - virtual Region& operator=(const Region& r); - virtual bool operator==(const Region&) const; - - // - // IObject interface - // - virtual Region* clone(); - - // - // ISerializable interface - // - virtual uint32_t getByteArraySize(); - virtual void loadFromByteArray(const byte* data); - virtual void storeToByteArray(byte** data, uint32_t& length); - - // - // IShape interface - // - virtual bool intersectsShape(const IShape& in) const; - virtual bool containsShape(const IShape& in) const; - virtual bool touchesShape(const IShape& in) const; - virtual void getCenter(Point& out) const; - virtual uint32_t getDimension() const; - virtual void getMBR(Region& out) const; - virtual double getArea() const; - virtual double getMinimumDistance(const IShape& in) const; - - virtual bool intersectsRegion(const Region& in) const; - virtual bool containsRegion(const Region& in) const; - virtual bool touchesRegion(const Region& in) const; - virtual double getMinimumDistance(const Region& in) const; - - virtual bool intersectsLineSegment(const LineSegment& in) const; - - virtual bool containsPoint(const Point& in) const; - virtual bool touchesPoint(const Point& in) const; - virtual double getMinimumDistance(const Point& in) const; - - virtual Region getIntersectingRegion(const Region& r) const; - virtual double getIntersectingArea(const Region& in) const; - virtual double getMargin() const; - - virtual void combineRegion(const Region& in); - virtual void combinePoint(const Point& in); - virtual void getCombinedRegion(Region& out, const Region& in) const; - - virtual double getLow(uint32_t index) const; - virtual double getHigh(uint32_t index) const; - - virtual void makeInfinite(uint32_t dimension); - virtual void makeDimension(uint32_t dimension); - - private: - void initialize(const double* pLow, const double* pHigh, uint32_t dimension); - - public: - uint32_t m_dimension; - double* m_pLow; - double* m_pHigh; - - friend std::ostream& operator<<(std::ostream& os, const Region& r); - }; // Region - - typedef Tools::PoolPointer RegionPtr; - std::ostream& operator<<(std::ostream& os, const Region& r); -} diff --git a/support/spatialindex/include/spatialindex/SpatialIndex.h b/support/spatialindex/include/spatialindex/SpatialIndex.h deleted file mode 100644 index f3d20dd5..00000000 --- a/support/spatialindex/include/spatialindex/SpatialIndex.h +++ /dev/null @@ -1,260 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2003, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -#include "tools/Tools.h" - -#ifndef M_PI_2 -#define M_PI_2 1.57079632679489661922 -#endif - -namespace SpatialIndex -{ - class Point; - class LineSegment; - class Region; - - - typedef int64_t id_type; - - enum CommandType - { - CT_NODEREAD = 0x0, - CT_NODEDELETE, - CT_NODEWRITE - }; - - class InvalidPageException : public Tools::Exception - { - public: - InvalidPageException(id_type id); - virtual ~InvalidPageException() {} - virtual std::string what(); - - private: - std::string m_error; - }; // InvalidPageException - - // - // Interfaces - // - - class IShape : public Tools::ISerializable - { - public: - virtual bool intersectsShape(const IShape& in) const = 0; - virtual bool containsShape(const IShape& in) const = 0; - virtual bool touchesShape(const IShape& in) const = 0; - virtual void getCenter(Point& out) const = 0; - virtual uint32_t getDimension() const = 0; - virtual void getMBR(Region& out) const = 0; - virtual double getArea() const = 0; - virtual double getMinimumDistance(const IShape& in) const = 0; - virtual ~IShape() {} - }; // IShape - - class ITimeShape : public Tools::IInterval - { - public: - virtual bool intersectsShapeInTime(const ITimeShape& in) const = 0; - virtual bool intersectsShapeInTime(const Tools::IInterval& ivI, const ITimeShape& in) const = 0; - virtual bool containsShapeInTime(const ITimeShape& in) const = 0; - virtual bool containsShapeInTime(const Tools::IInterval& ivI, const ITimeShape& in) const = 0; - virtual bool touchesShapeInTime(const ITimeShape& in) const = 0; - virtual bool touchesShapeInTime(const Tools::IInterval& ivI, const ITimeShape& in) const = 0; - virtual double getAreaInTime() const = 0; - virtual double getAreaInTime(const Tools::IInterval& ivI) const = 0; - virtual double getIntersectingAreaInTime(const ITimeShape& r) const = 0; - virtual double getIntersectingAreaInTime(const Tools::IInterval& ivI, const ITimeShape& r) const = 0; - virtual ~ITimeShape() {} - }; // ITimeShape - - class IEvolvingShape - { - public: - virtual void getVMBR(Region& out) const = 0; - virtual void getMBRAtTime(double t, Region& out) const = 0; - virtual ~IEvolvingShape() {} - }; // IEvolvingShape - - class IEntry : public Tools::IObject - { - public: - virtual id_type getIdentifier() const = 0; - virtual void getShape(IShape** out) const = 0; - virtual ~IEntry() {} - }; // IEntry - - class INode : public IEntry, public Tools::ISerializable - { - public: - virtual uint32_t getChildrenCount() const = 0; - virtual id_type getChildIdentifier(uint32_t index) const = 0; - virtual void getChildData(uint32_t index, uint32_t& len, byte** data) const = 0; - virtual void getChildShape(uint32_t index, IShape** out) const = 0; - virtual uint32_t getLevel() const = 0; - virtual bool isIndex() const = 0; - virtual bool isLeaf() const = 0; - virtual ~INode() {} - }; // INode - - class IData : public IEntry - { - public: - virtual void getData(uint32_t& len, byte** data) const = 0; - virtual ~IData() {} - }; // IData - - class IDataStream : public Tools::IObjectStream - { - public: - virtual IData* getNext() = 0; - virtual ~IDataStream() {} - }; // IDataStream - - class ICommand - { - public: - virtual void execute(const INode& in) = 0; - virtual ~ICommand() {} - }; // ICommand - - class INearestNeighborComparator - { - public: - virtual double getMinimumDistance(const IShape& query, const IShape& entry) = 0; - virtual double getMinimumDistance(const IShape& query, const IData& data) = 0; - virtual ~INearestNeighborComparator() {} - }; // INearestNeighborComparator - - class IStorageManager - { - public: - virtual void loadByteArray(const id_type id, uint32_t& len, byte** data) = 0; - virtual void storeByteArray(id_type& id, const uint32_t len, const byte* const data) = 0; - virtual void deleteByteArray(const id_type id) = 0; - virtual ~IStorageManager() {} - }; // IStorageManager - - class IVisitor - { - public: - virtual void visitNode(const INode& in) = 0; - virtual void visitData(const IData& in) = 0; - virtual void visitData(std::vector& v) = 0; - virtual ~IVisitor() {} - }; // IVisitor - - class IQueryStrategy - { - public: - virtual void getNextEntry(const IEntry& previouslyFetched, id_type& nextEntryToFetch, bool& bFetchNextEntry) = 0; - virtual ~IQueryStrategy() {} - }; // IQueryStrategy - - class IStatistics - { - public: - virtual uint64_t getReads() const = 0; - virtual uint64_t getWrites() const = 0; - virtual uint32_t getNumberOfNodes() const = 0; - virtual uint64_t getNumberOfData() const = 0; - virtual ~IStatistics() {} - }; // IStatistics - - class ISpatialIndex - { - public: - virtual void insertData(uint32_t len, const byte* pData, const IShape& shape, id_type shapeIdentifier) = 0; - virtual bool deleteData(const IShape& shape, id_type shapeIdentifier) = 0; - virtual void containsWhatQuery(const IShape& query, IVisitor& v) = 0; - virtual void intersectsWithQuery(const IShape& query, IVisitor& v) = 0; - virtual void pointLocationQuery(const Point& query, IVisitor& v) = 0; - virtual void nearestNeighborQuery(uint32_t k, const IShape& query, IVisitor& v, INearestNeighborComparator& nnc) = 0; - virtual void nearestNeighborQuery(uint32_t k, const IShape& query, IVisitor& v) = 0; - virtual void selfJoinQuery(const IShape& s, IVisitor& v) = 0; - virtual void queryStrategy(IQueryStrategy& qs) = 0; - virtual void getIndexProperties(Tools::PropertySet& out) const = 0; - virtual void addCommand(ICommand* in, CommandType ct) = 0; - virtual bool isIndexValid() = 0; - virtual void getStatistics(IStatistics** out) const = 0; - virtual ~ISpatialIndex() {} - - }; // ISpatialIndex - - namespace StorageManager - { - enum StorageManagerConstants - { - EmptyPage = -0x1, - NewPage = -0x1 - }; - - class IBuffer : public IStorageManager - { - public: - virtual uint64_t getHits() = 0; - virtual void clear() = 0; - virtual ~IBuffer() {} - }; // IBuffer - - IStorageManager* returnMemoryStorageManager(Tools::PropertySet& in); - IStorageManager* createNewMemoryStorageManager(); - - IStorageManager* returnDiskStorageManager(Tools::PropertySet& in); - IStorageManager* createNewDiskStorageManager(std::string& baseName, uint32_t pageSize); - IStorageManager* loadDiskStorageManager(std::string& baseName); - - IBuffer* returnRandomEvictionsBuffer(IStorageManager& ind, Tools::PropertySet& in); - IBuffer* createNewRandomEvictionsBuffer(IStorageManager& in, uint32_t capacity, bool bWriteThrough); - } - - // - // Global functions - // - std::ostream& operator<<(std::ostream&, const ISpatialIndex&); - std::ostream& operator<<(std::ostream&, const IStatistics&); -} - -#include "Point.h" -#include "Region.h" -#include "LineSegment.h" -#include "TimePoint.h" -#include "TimeRegion.h" -#include "MovingPoint.h" -#include "MovingRegion.h" -#include "RTree.h" -#include "MVRTree.h" -#include "TPRTree.h" -#include "Version.h" - - -// typedef SpatialIndex::Tools::PoolPointer RegionPtr; -// typedef SpatialIndex::Tools::PoolPointer PointPtr; -// typedef SpatialIndex::Tools::PoolPointer TimeRegionPtr; -// typedef SpatialIndex::Tools::PoolPointer MovingRegionPtr; diff --git a/support/spatialindex/include/spatialindex/TPRTree.h b/support/spatialindex/include/spatialindex/TPRTree.h deleted file mode 100644 index 35952731..00000000 --- a/support/spatialindex/include/spatialindex/TPRTree.h +++ /dev/null @@ -1,85 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2003, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - - -#pragma once - -namespace SpatialIndex -{ - namespace TPRTree - { - enum TPRTreeVariant - { - TPRV_RSTAR = 0x0 - }; - - enum PersistenObjectIdentifier - { - PersistentIndex = 0x1, - PersistentLeaf = 0x2 - }; - - enum RangeQueryType - { - ContainmentQuery = 0x1, - IntersectionQuery = 0x2 - }; - - class Data : public IData, public Tools::ISerializable - { - public: - Data(uint32_t len, byte* pData, MovingRegion& r, id_type id); - virtual ~Data(); - - virtual Data* clone(); - virtual id_type getIdentifier() const; - virtual void getShape(IShape** out) const; - virtual void getData(uint32_t& len, byte** data) const; - virtual uint32_t getByteArraySize(); - virtual void loadFromByteArray(const byte* data); - virtual void storeToByteArray(byte** data, uint32_t& len); - - id_type m_id; - MovingRegion m_region; - byte* m_pData; - uint32_t m_dataLength; - }; // Data - - ISpatialIndex* returnTPRTree(IStorageManager& ind, Tools::PropertySet& in); - ISpatialIndex* createNewTPRTree( - IStorageManager& sm, - double fillFactor, - uint32_t indexCapacity, - uint32_t leafCapacity, - uint32_t dimension, - TPRTreeVariant rv, - double horizon, - id_type& indexIdentifier - ); - ISpatialIndex* loadTPRTree(IStorageManager& in, id_type indexIdentifier); - } -} diff --git a/support/spatialindex/include/spatialindex/TimePoint.h b/support/spatialindex/include/spatialindex/TimePoint.h deleted file mode 100644 index fa5948d2..00000000 --- a/support/spatialindex/include/spatialindex/TimePoint.h +++ /dev/null @@ -1,95 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2004, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -namespace SpatialIndex -{ - class TimePoint : public Point, public ITimeShape - { - public: - TimePoint(); - TimePoint(const double* pCoords, const Tools::IInterval& ti, uint32_t dimension); - TimePoint(const double* pCoords, double tStart, double tEnd, uint32_t dimension); - TimePoint(const Point& p, const Tools::IInterval& ti); - TimePoint(const Point& p, double tStart, double tEnd); - TimePoint(const TimePoint& p); - virtual ~TimePoint(); - - virtual TimePoint& operator=(const TimePoint& p); - virtual bool operator==(const TimePoint& p) const; - - // - // IObject interface - // - virtual TimePoint* clone(); - - // - // ISerializable interface - // - virtual uint32_t getByteArraySize(); - virtual void loadFromByteArray(const byte* data); - virtual void storeToByteArray(byte** data, uint32_t& len); - - // - // ITimeShape interface - // - virtual bool intersectsShapeInTime(const ITimeShape& in) const; - virtual bool intersectsShapeInTime(const Tools::IInterval& ivI, const ITimeShape& in) const; - virtual bool containsShapeInTime(const ITimeShape& in) const; - virtual bool containsShapeInTime(const Tools::IInterval& ivI, const ITimeShape& in) const; - virtual bool touchesShapeInTime(const ITimeShape& in) const; - virtual bool touchesShapeInTime(const Tools::IInterval& ivI, const ITimeShape& in) const; - virtual double getAreaInTime() const; - virtual double getAreaInTime(const Tools::IInterval& ivI) const; - virtual double getIntersectingAreaInTime(const ITimeShape& r) const; - virtual double getIntersectingAreaInTime(const Tools::IInterval& ivI, const ITimeShape& r) const; - - // - // IInterval interface - // - virtual Tools::IInterval& operator=(const Tools::IInterval&); - virtual double getLowerBound() const; - virtual double getUpperBound() const; - virtual void setBounds(double, double); - virtual bool intersectsInterval(const Tools::IInterval& ti) const; - virtual bool intersectsInterval(Tools::IntervalType t, const double start, const double end) const; - virtual bool containsInterval(const Tools::IInterval& ti) const; - virtual Tools::IntervalType getIntervalType() const; - - virtual void makeInfinite(uint32_t dimension); - virtual void makeDimension(uint32_t dimension); - - public: - double m_startTime; - double m_endTime; - - friend std::ostream& operator<<(std::ostream& os, const TimePoint& pt); - }; // TimePoint - - std::ostream& operator<<(std::ostream& os, const TimePoint& pt); -} diff --git a/support/spatialindex/include/spatialindex/TimeRegion.h b/support/spatialindex/include/spatialindex/TimeRegion.h deleted file mode 100644 index ae0de58c..00000000 --- a/support/spatialindex/include/spatialindex/TimeRegion.h +++ /dev/null @@ -1,109 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2003, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -namespace SpatialIndex -{ - class TimeRegion : public Region, public ITimeShape - { - public: - TimeRegion(); - TimeRegion(const double* pLow, const double* pHigh, const Tools::IInterval& ti, uint32_t dimension); - TimeRegion(const double* pLow, const double* pHigh, double tStart, double tEnd, uint32_t dimension); - TimeRegion(const Point& low, const Point& high, const Tools::IInterval& ti); - TimeRegion(const Point& low, const Point& high, double tStart, double tEnd); - TimeRegion(const Region& in, const Tools::IInterval& ti); - TimeRegion(const Region& in, double tStart, double tEnd); - TimeRegion(const TimePoint& low, const TimePoint& high); - TimeRegion(const TimeRegion& in); - virtual ~TimeRegion(); - - virtual TimeRegion& operator=(const TimeRegion& r); - virtual bool operator==(const TimeRegion&) const; - - virtual bool intersectsRegionInTime(const TimeRegion& in) const; - virtual bool containsRegionInTime(const TimeRegion& in) const; - virtual bool touchesRegionInTime(const TimeRegion& in) const; - - virtual bool containsPointInTime(const TimePoint& in) const; - virtual bool touchesPointInTime(const TimePoint& in) const; - - virtual void combineRegionInTime(const TimeRegion& in); - virtual void getCombinedRegionInTime(TimeRegion& out, const TimeRegion& in) const; - - // - // IObject interface - // - virtual TimeRegion* clone(); - - // - // ISerializable interface - // - virtual uint32_t getByteArraySize(); - virtual void loadFromByteArray(const byte* data); - virtual void storeToByteArray(byte** data, uint32_t& len); - - // - // ITimeShape interface - // - virtual bool intersectsShapeInTime(const ITimeShape& in) const; - virtual bool intersectsShapeInTime(const Tools::IInterval& ivI, const ITimeShape& in) const; - virtual bool containsShapeInTime(const ITimeShape& in) const; - virtual bool containsShapeInTime(const Tools::IInterval& ivI, const ITimeShape& in) const; - virtual bool touchesShapeInTime(const ITimeShape& in) const; - virtual bool touchesShapeInTime(const Tools::IInterval& ivI, const ITimeShape& in) const; - virtual double getAreaInTime() const; - virtual double getAreaInTime(const Tools::IInterval& ivI) const; - virtual double getIntersectingAreaInTime(const ITimeShape& r) const; - virtual double getIntersectingAreaInTime(const Tools::IInterval& ivI, const ITimeShape& r) const; - - // - // IInterval interface - // - virtual Tools::IInterval& operator=(const Tools::IInterval&); - virtual double getLowerBound() const; - virtual double getUpperBound() const; - virtual void setBounds(double, double); - virtual bool intersectsInterval(const Tools::IInterval& ti) const; - virtual bool intersectsInterval(Tools::IntervalType t, const double start, const double end) const; - virtual bool containsInterval(const Tools::IInterval& ti) const; - virtual Tools::IntervalType getIntervalType() const; - - virtual void makeInfinite(uint32_t dimension); - virtual void makeDimension(uint32_t dimension); - - public: - double m_startTime; - double m_endTime; - - friend std::ostream& operator<<(std::ostream& os, const TimeRegion& r); - }; // TimeRegion - - typedef Tools::PoolPointer TimeRegionPtr; - std::ostream& operator<<(std::ostream& os, const TimeRegion& r); -} diff --git a/support/spatialindex/include/spatialindex/Version.h b/support/spatialindex/include/spatialindex/Version.h deleted file mode 100644 index 60520e98..00000000 --- a/support/spatialindex/include/spatialindex/Version.h +++ /dev/null @@ -1,48 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2003, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -#ifndef SIDX_VERSION_MAJOR -#define SIDX_VERSION_MAJOR 1 -#define SIDX_VERSION_MINOR 8 -#define SIDX_VERSION_REV 1 -#define SIDX_VERSION_BUILD 0 -#endif - -#ifndef SIDX_VERSION_NUM -#define SIDX_VERSION_NUM (SIDX_VERSION_MAJOR*1000+SIDX_VERSION_MINOR*100+SIDX_VERSION_REV*10+SIDX_VERSION_BUILD) -#endif - -#ifndef SIDX_RELEASE_DATE -#define SIDX_RELEASE_DATE 20130626 -#endif - -#ifndef SIDX_RELEASE_NAME -#define SIDX_RELEASE_NAME "1.8.1" -#endif - diff --git a/support/spatialindex/include/spatialindex/capi/BoundsQuery.h b/support/spatialindex/include/spatialindex/capi/BoundsQuery.h deleted file mode 100644 index b0eeda7c..00000000 --- a/support/spatialindex/include/spatialindex/capi/BoundsQuery.h +++ /dev/null @@ -1,46 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: C++ object declarations to implement the bounds query. - * Author: Howard Butler, hobu.inc@gmail.com - ****************************************************************************** - * Copyright (c) 2009, Howard Butler - * - * 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. -******************************************************************************/ - -#pragma once - -class BoundsQuery : public SpatialIndex::IQueryStrategy -{ -private: - SpatialIndex::Region* m_bounds; - -public: - - BoundsQuery(); - ~BoundsQuery() { if (m_bounds != 0) delete m_bounds; } - void getNextEntry( const SpatialIndex::IEntry& entry, - SpatialIndex::id_type& nextEntry, - bool& hasNext); - - SpatialIndex::Region* GetBounds() const { return m_bounds; } -}; - diff --git a/support/spatialindex/include/spatialindex/capi/CountVisitor.h b/support/spatialindex/include/spatialindex/capi/CountVisitor.h deleted file mode 100644 index bf4e8c1a..00000000 --- a/support/spatialindex/include/spatialindex/capi/CountVisitor.h +++ /dev/null @@ -1,46 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: C++ objects to implement the count visitor. - * Author: Leonard Norrgård, leonard.norrgard@refactor.fi - ****************************************************************************** - * Copyright (c) 2010, Leonard Norrgård - * - * 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. -******************************************************************************/ - -#pragma once - -class CountVisitor : public SpatialIndex::IVisitor -{ -private: - uint64_t nResults; - -public: - - CountVisitor(); - ~CountVisitor(); - - uint64_t GetResultCount() const { return nResults; } - - void visitNode(const SpatialIndex::INode& n); - void visitData(const SpatialIndex::IData& d); - void visitData(std::vector& v); -}; diff --git a/support/spatialindex/include/spatialindex/capi/CustomStorage.h b/support/spatialindex/include/spatialindex/capi/CustomStorage.h deleted file mode 100644 index 77a46121..00000000 --- a/support/spatialindex/include/spatialindex/capi/CustomStorage.h +++ /dev/null @@ -1,82 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: C++ object declarations to implement the custom storage manager. - * Author: Matthias (nitro), nitro@dr-code.org - ****************************************************************************** - * Copyright (c) 2010, Matthias (nitro) - * - * 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. -******************************************************************************/ - -#pragma once - -namespace SpatialIndex -{ - namespace StorageManager - { - struct CustomStorageManagerCallbacks - { - CustomStorageManagerCallbacks() - : context(0) - , createCallback(0) - , destroyCallback(0) - , loadByteArrayCallback(0) - , storeByteArrayCallback(0) - , deleteByteArrayCallback(0) - {} - - void* context; - void (*createCallback)( const void* context, int* errorCode ); - void (*destroyCallback)( const void* context, int* errorCode ); - void (*flushCallback)( const void* context, int* errorCode ); - void (*loadByteArrayCallback)( const void* context, const id_type page, uint32_t* len, byte** data, int* errorCode ); - void (*storeByteArrayCallback)( const void* context, id_type* page, const uint32_t len, const byte* const data, int* errorCode ); - void (*deleteByteArrayCallback)( const void* context, const id_type page, int* errorCode ); - }; - - class CustomStorageManager : public SpatialIndex::IStorageManager - { - public: - // I'd like this to be an enum, but casting between enums and ints is not nice - static const int NoError = 0; - static const int InvalidPageError = 1; - static const int IllegalStateError = 2; - - CustomStorageManager(Tools::PropertySet&); - - virtual ~CustomStorageManager(); - - virtual void flush(); - virtual void loadByteArray(const id_type page, uint32_t& len, byte** data); - virtual void storeByteArray(id_type& page, const uint32_t len, const byte* const data); - virtual void deleteByteArray(const id_type page); - - private: - CustomStorageManagerCallbacks callbacks; - - inline void processErrorCode(int errorCode, const id_type page); - }; // CustomStorageManager - - // factory function - IStorageManager* returnCustomStorageManager(Tools::PropertySet& in); - } -} - diff --git a/support/spatialindex/include/spatialindex/capi/DataStream.h b/support/spatialindex/include/spatialindex/capi/DataStream.h deleted file mode 100644 index 3425bfe2..00000000 --- a/support/spatialindex/include/spatialindex/capi/DataStream.h +++ /dev/null @@ -1,54 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: Declarations to support stream loading via C API - * Author: Howard Butler, hobu.inc@gmail.com - ****************************************************************************** - * Copyright (c) 2009, Howard Butler - * - * 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. -******************************************************************************/ - -#pragma once - -class DataStream : public SpatialIndex::IDataStream -{ -public: - DataStream(int (*readNext)(SpatialIndex::id_type* id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, uint32_t *nDataLength)); - ~DataStream(); - - SpatialIndex::IData* getNext(); - bool hasNext() throw (Tools::NotSupportedException); - - uint32_t size() throw (Tools::NotSupportedException); - void rewind() throw (Tools::NotSupportedException); - -protected: - SpatialIndex::RTree::Data* m_pNext; - SpatialIndex::id_type m_id; - -private: - int (*iterfunct)(SpatialIndex::id_type *id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, uint32_t *nDataLength); - - bool readData(); - bool m_bDoneReading; - -}; - diff --git a/support/spatialindex/include/spatialindex/capi/Error.h b/support/spatialindex/include/spatialindex/capi/Error.h deleted file mode 100644 index 1675fff7..00000000 --- a/support/spatialindex/include/spatialindex/capi/Error.h +++ /dev/null @@ -1,52 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: C++ object declarations to implement the error object. - * Author: Howard Butler, hobu.inc@gmail.com - ****************************************************************************** - * Copyright (c) 2009, Howard Butler - * - * 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. -******************************************************************************/ - -#pragma once - -class Error -{ -public: - - Error(int code, std::string const& message, std::string const& method); - - /// Copy constructor. - Error(Error const& other); - - /// Assignment operator. - Error& operator=(Error const& rhs); - - int GetCode() const { return m_code; } - const char* GetMessage() const { return m_message.c_str(); } - const char* GetMethod() const { return m_method.c_str(); } - -private: - - int m_code; - std::string m_message; - std::string m_method; -}; diff --git a/support/spatialindex/include/spatialindex/capi/IdVisitor.h b/support/spatialindex/include/spatialindex/capi/IdVisitor.h deleted file mode 100644 index 723791c8..00000000 --- a/support/spatialindex/include/spatialindex/capi/IdVisitor.h +++ /dev/null @@ -1,48 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: C++ object declarations to implement a query ids only. - * Author: Howard Butler, hobu.inc@gmail.com - ****************************************************************************** - * Copyright (c) 2009, Howard Butler - * - * 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. -******************************************************************************/ - -#pragma once - -class IdVisitor : public SpatialIndex::IVisitor -{ -private: - std::vector m_vector; - uint64_t nResults; - -public: - - IdVisitor(); - ~IdVisitor(); - - uint64_t GetResultCount() const { return nResults; } - std::vector& GetResults() { return m_vector; } - - void visitNode(const SpatialIndex::INode& n); - void visitData(const SpatialIndex::IData& d); - void visitData(std::vector& v); -}; diff --git a/support/spatialindex/include/spatialindex/capi/Index.h b/support/spatialindex/include/spatialindex/capi/Index.h deleted file mode 100644 index f0e9c90a..00000000 --- a/support/spatialindex/include/spatialindex/capi/Index.h +++ /dev/null @@ -1,69 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: C++ object declarations to implement the wrapper. - * Author: Howard Butler, hobu.inc@gmail.com - ****************************************************************************** - * Copyright (c) 2009, Howard Butler - * - * 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. -******************************************************************************/ - -#pragma once - -class Index -{ - -public: - Index(const Tools::PropertySet& poProperties); - Index(const Tools::PropertySet& poProperties, int (*readNext)(SpatialIndex::id_type *id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, uint32_t *nDataLength)); - ~Index(); - - const Tools::PropertySet& GetProperties() { return m_properties; } - - bool insertFeature(uint64_t id, double *min, double *max); - - RTIndexType GetIndexType(); - void SetIndexType(RTIndexType v); - - RTStorageType GetIndexStorage(); - void SetIndexStorage(RTStorageType v); - - RTIndexVariant GetIndexVariant(); - void SetIndexVariant(RTStorageType v); - - SpatialIndex::ISpatialIndex& index() {return *m_rtree;} - SpatialIndex::StorageManager::IBuffer& buffer() {return *m_buffer;} - -private: - - void Initialize(); - SpatialIndex::IStorageManager* m_storage; - SpatialIndex::StorageManager::IBuffer* m_buffer; - SpatialIndex::ISpatialIndex* m_rtree; - - Tools::PropertySet m_properties; - - - void Setup(); - SpatialIndex::IStorageManager* CreateStorage(); - SpatialIndex::StorageManager::IBuffer* CreateIndexBuffer(SpatialIndex::IStorageManager& storage); - SpatialIndex::ISpatialIndex* CreateIndex(); -}; diff --git a/support/spatialindex/include/spatialindex/capi/LeafQuery.h b/support/spatialindex/include/spatialindex/capi/LeafQuery.h deleted file mode 100644 index 008f09a7..00000000 --- a/support/spatialindex/include/spatialindex/capi/LeafQuery.h +++ /dev/null @@ -1,71 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: C++ object declarations to implement a query of the index's leaves. - * Author: Howard Butler, hobu.inc@gmail.com - ****************************************************************************** - * Copyright (c) 2009, Howard Butler - * - * 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. -******************************************************************************/ - -#pragma once - -class LeafQueryResult; - -class LeafQuery : public SpatialIndex::IQueryStrategy -{ -private: - std::queue m_ids; - std::vector m_results; -public: - - LeafQuery(); - ~LeafQuery() { } - void getNextEntry( const SpatialIndex::IEntry& entry, - SpatialIndex::id_type& nextEntry, - bool& hasNext); - std::vector const& GetResults() const {return m_results;} -}; - -class LeafQueryResult -{ -private: - std::vector ids; - SpatialIndex::Region* bounds; - uint32_t m_id; - LeafQueryResult(); -public: - LeafQueryResult(uint32_t id) : bounds(0), m_id(id){} - ~LeafQueryResult() {if (bounds!=0) delete bounds;} - - /// Copy constructor. - LeafQueryResult(LeafQueryResult const& other); - - /// Assignment operator. - LeafQueryResult& operator=(LeafQueryResult const& rhs); - - std::vector const& GetIDs() const; - void SetIDs(std::vector& v); - const SpatialIndex::Region* GetBounds() const; - void SetBounds(const SpatialIndex::Region* b); - uint32_t getIdentifier() const {return m_id;} - void setIdentifier(uint32_t v) {m_id = v;} -}; diff --git a/support/spatialindex/include/spatialindex/capi/ObjVisitor.h b/support/spatialindex/include/spatialindex/capi/ObjVisitor.h deleted file mode 100644 index 23234d91..00000000 --- a/support/spatialindex/include/spatialindex/capi/ObjVisitor.h +++ /dev/null @@ -1,49 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: C++ object declarations to implement the object visitor. - * Author: Howard Butler, hobu.inc@gmail.com - ****************************************************************************** - * Copyright (c) 2009, Howard Butler - * - * 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. -******************************************************************************/ - -#pragma once - -class ObjVisitor : public SpatialIndex::IVisitor -{ -private: - std::vector m_vector; - uint64_t nResults; - -public: - - ObjVisitor(); - ~ObjVisitor(); - - uint32_t GetResultCount() const { return nResults; } - std::vector& GetResults() { return m_vector; } - - void visitNode(const SpatialIndex::INode& n); - void visitData(const SpatialIndex::IData& d); - void visitData(std::vector& v); -}; - diff --git a/support/spatialindex/include/spatialindex/capi/sidx_api.h b/support/spatialindex/include/spatialindex/capi/sidx_api.h deleted file mode 100644 index 0169ef5b..00000000 --- a/support/spatialindex/include/spatialindex/capi/sidx_api.h +++ /dev/null @@ -1,213 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: C API. - * Author: Howard Butler, hobu.inc@gmail.com - ****************************************************************************** - * Copyright (c) 2009, Howard Butler - * - * 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. -******************************************************************************/ - -#ifndef SIDX_API_H_INCLUDED -#define SIDX_API_H_INCLUDED - -#define SIDX_C_API 1 - -#include "sidx_config.h" - -IDX_C_START - -IndexH Index_Create(IndexPropertyH properties); - -IndexH Index_CreateWithStream( IndexPropertyH properties, - int (*readNext)(int64_t *id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, size_t *nDataLength) - ); - -void Index_Destroy(IndexH index); -IndexPropertyH Index_GetProperties(IndexH index); - -RTError Index_DeleteData( IndexH index, - int64_t id, - double* pdMin, - double* pdMax, - uint32_t nDimension); - -RTError Index_InsertData( IndexH index, - int64_t id, - double* pdMin, - double* pdMax, - uint32_t nDimension, - const uint8_t* pData, - size_t nDataLength); - -uint32_t Index_IsValid(IndexH index); - -RTError Index_Intersects_obj( IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - IndexItemH** items, - uint64_t* nResults); - -RTError Index_Intersects_id( IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - int64_t** items, - uint64_t* nResults); - -RTError Index_Intersects_count( IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - uint64_t* nResults); -RTError Index_NearestNeighbors_obj(IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - IndexItemH** items, - uint64_t* nResults); - -RTError Index_NearestNeighbors_id( IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - int64_t** items, - uint64_t* nResults); - -RTError Index_GetBounds( IndexH index, - double** ppdMin, - double** ppdMax, - uint32_t* nDimension); - - -SIDX_C_DLL RTError Index_GetLeaves( IndexH index, - uint32_t* nLeafNodes, - uint32_t** nLeafSizes, - int64_t** nLeafIDs, - int64_t*** nLeafChildIDs, - double*** pppdMin, - double*** pppdMax, - uint32_t* nDimension); - -void Index_DestroyObjResults(IndexItemH* results, uint32_t nResults); -void Index_ClearBuffer(IndexH index); -void Index_Free(void* object); - -void IndexItem_Destroy(IndexItemH item); -int64_t IndexItem_GetID(IndexItemH item); - -RTError IndexItem_GetData(IndexItemH item, uint8_t** data, uint64_t* length); - -RTError IndexItem_GetBounds( IndexItemH item, - double** ppdMin, - double** ppdMax, - uint32_t* nDimension); - -IndexPropertyH IndexProperty_Create(); -void IndexProperty_Destroy(IndexPropertyH hProp); - -RTError IndexProperty_SetIndexType(IndexPropertyH iprop, RTIndexType value); -RTIndexType IndexProperty_GetIndexType(IndexPropertyH iprop); - -RTError IndexProperty_SetDimension(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetDimension(IndexPropertyH iprop); - -RTError IndexProperty_SetIndexVariant(IndexPropertyH iprop, RTIndexVariant value); -RTIndexVariant IndexProperty_GetIndexVariant(IndexPropertyH iprop); - -RTError IndexProperty_SetIndexStorage(IndexPropertyH iprop, RTStorageType value); -RTStorageType IndexProperty_GetIndexStorage(IndexPropertyH iprop); - -RTError IndexProperty_SetPagesize(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetPagesize(IndexPropertyH iprop); - -RTError IndexProperty_SetIndexCapacity(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetIndexCapacity(IndexPropertyH iprop); - -RTError IndexProperty_SetLeafCapacity(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetLeafCapacity(IndexPropertyH iprop); - -RTError IndexProperty_SetLeafPoolCapacity(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetLeafPoolCapacity(IndexPropertyH iprop); - -RTError IndexProperty_SetIndexPoolCapacity(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetIndexPoolCapacity(IndexPropertyH iprop); - -RTError IndexProperty_SetRegionPoolCapacity(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetRegionPoolCapacity(IndexPropertyH iprop); - -RTError IndexProperty_SetPointPoolCapacity(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetPointPoolCapacity(IndexPropertyH iprop); - -RTError IndexProperty_SetBufferingCapacity(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetBufferingCapacity(IndexPropertyH iprop); - -RTError IndexProperty_SetEnsureTightMBRs(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetEnsureTightMBRs(IndexPropertyH iprop); - -RTError IndexProperty_SetOverwrite(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetOverwrite(IndexPropertyH iprop); - -RTError IndexProperty_SetNearMinimumOverlapFactor(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetNearMinimumOverlapFactor(IndexPropertyH iprop); - -RTError IndexProperty_SetWriteThrough(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetWriteThrough(IndexPropertyH iprop); - -RTError IndexProperty_SetFillFactor(IndexPropertyH iprop, double value); -double IndexProperty_GetFillFactor(IndexPropertyH iprop); - -RTError IndexProperty_SetSplitDistributionFactor(IndexPropertyH iprop, double value); -double IndexProperty_GetSplitDistributionFactor(IndexPropertyH iprop); - -RTError IndexProperty_SetTPRHorizon(IndexPropertyH iprop, double value); -double IndexProperty_GetTPRHorizon(IndexPropertyH iprop); - -RTError IndexProperty_SetReinsertFactor(IndexPropertyH iprop, double value); -double IndexProperty_GetReinsertFactor(IndexPropertyH iprop); - -RTError IndexProperty_SetFileName(IndexPropertyH iprop, const char* value); -char* IndexProperty_GetFileName(IndexPropertyH iprop); - -RTError IndexProperty_SetFileNameExtensionDat(IndexPropertyH iprop, const char* value); -char* IndexProperty_GetFileNameExtensionDat(IndexPropertyH iprop); - -RTError IndexProperty_SetFileNameExtensionIdx(IndexPropertyH iprop, const char* value); -char* IndexProperty_GetFileNameExtensionIdx(IndexPropertyH iprop); - -RTError IndexProperty_SetCustomStorageCallbacksSize(IndexPropertyH iprop, uint32_t value); -uint32_t IndexProperty_GetCustomStorageCallbacksSize(IndexPropertyH iprop); - -RTError IndexProperty_SetCustomStorageCallbacks(IndexPropertyH iprop, const void* value); -void* IndexProperty_GetCustomStorageCallbacks(IndexPropertyH iprop); - -RTError IndexProperty_SetIndexID(IndexPropertyH iprop, int64_t value); -int64_t IndexProperty_GetIndexID(IndexPropertyH iprop); - -SIDX_C_DLL void* SIDX_NewBuffer(size_t bytes); -SIDX_C_DLL void SIDX_DeleteBuffer(void* buffer); - -SIDX_C_DLL char* SIDX_Version(); - -IDX_C_END - -#endif \ No newline at end of file diff --git a/support/spatialindex/include/spatialindex/capi/sidx_config.h b/support/spatialindex/include/spatialindex/capi/sidx_config.h deleted file mode 100644 index 1bf32bdb..00000000 --- a/support/spatialindex/include/spatialindex/capi/sidx_config.h +++ /dev/null @@ -1,126 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: C API configuration - * Author: Howard Butler, hobu.inc@gmail.com - ****************************************************************************** - * Copyright (c) 2009, Howard Butler - * - * 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. -******************************************************************************/ - -#ifndef SIDX_CONFIG_H_INCLUDED -#define SIDX_CONFIG_H_INCLUDED - - - -#ifdef _MSC_VER - -#if _MSC_VER <= 1500 - typedef __int8 int8_t; - typedef __int16 int16_t; - typedef __int32 int32_t; - typedef __int64 int64_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int64 uint64_t; -#endif - - #include - #define STRDUP _strdup - #include - #include - -#else - - #include - #define SIDX_THREAD __thread - #include - #define STRDUP strdup -#endif - -#include - - - -class Item; -class Index; - -typedef enum -{ - RT_None = 0, - RT_Debug = 1, - RT_Warning = 2, - RT_Failure = 3, - RT_Fatal = 4 -} RTError; - -typedef enum -{ - RT_RTree = 0, - RT_MVRTree = 1, - RT_TPRTree = 2, - RT_InvalidIndexType = -99 -} RTIndexType; - -typedef enum -{ - RT_Memory = 0, - RT_Disk = 1, - RT_Custom = 2, - RT_InvalidStorageType = -99 -} RTStorageType; - -typedef enum -{ - RT_Linear = 0, - RT_Quadratic = 1, - RT_Star = 2, - RT_InvalidIndexVariant = -99 -} RTIndexVariant; - - -#ifdef __cplusplus -# define IDX_C_START extern "C" { -# define IDX_C_END } -#else -# define IDX_C_START -# define IDX_C_END -#endif - -typedef Index *IndexH; -typedef SpatialIndex::IData *IndexItemH; -typedef Tools::PropertySet *IndexPropertyH; - -#ifndef SIDX_C_DLL -#if defined(_MSC_VER) -# define SIDX_C_DLL __declspec(dllexport) -#else -# if defined(USE_GCC_VISIBILITY_FLAG) -# define SIDX_C_DLL __attribute__ ((visibility("default"))) -# else -# define SIDX_C_DLL -# endif -#endif -#endif - - -#endif diff --git a/support/spatialindex/include/spatialindex/capi/sidx_impl.h b/support/spatialindex/include/spatialindex/capi/sidx_impl.h deleted file mode 100644 index a52c5654..00000000 --- a/support/spatialindex/include/spatialindex/capi/sidx_impl.h +++ /dev/null @@ -1,46 +0,0 @@ -/****************************************************************************** - * Project: libsidx - A C API wrapper around libspatialindex - * Purpose: C++ object declarations to implement utilities. - * Author: Howard Butler, hobu.inc@gmail.com - ****************************************************************************** - * Copyright (c) 2009, Howard Butler - * - * 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. -******************************************************************************/ - -#include -#include -#include -#include -#include -#include - -#include "sidx_config.h" -#include "Utility.h" -#include "ObjVisitor.h" -#include "IdVisitor.h" -#include "CountVisitor.h" -#include "BoundsQuery.h" -#include "LeafQuery.h" -#include "Error.h" -#include "DataStream.h" -#include "Index.h" -#include "CustomStorage.h" diff --git a/support/spatialindex/include/spatialindex/tools/PointerPool.h b/support/spatialindex/include/spatialindex/tools/PointerPool.h deleted file mode 100644 index fde44bc7..00000000 --- a/support/spatialindex/include/spatialindex/tools/PointerPool.h +++ /dev/null @@ -1,123 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2004, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -#include "PoolPointer.h" - -namespace Tools -{ - template class PointerPool - { - public: - explicit PointerPool(uint32_t capacity) : m_capacity(capacity) - { - #ifndef NDEBUG - m_hits = 0; - m_misses = 0; - m_pointerCount = 0; - #endif - } - - ~PointerPool() - { - assert(m_pool.size() <= m_capacity); - - while (! m_pool.empty()) - { - X* x = m_pool.top(); m_pool.pop(); - #ifndef NDEBUG - --m_pointerCount; - #endif - delete x; - } - - #ifndef NDEBUG - std::cerr << "Lost pointers: " << m_pointerCount << std::endl; - #endif - } - - PoolPointer acquire() - { - X* p = 0; - - if (! m_pool.empty()) - { - p = m_pool.top(); m_pool.pop(); - #ifndef NDEBUG - m_hits++; - #endif - } - else - { - p = new X(); - #ifndef NDEBUG - m_pointerCount++; - m_misses++; - #endif - } - - return PoolPointer(p, this); - } - - void release(X* p) - { - if (m_pool.size() < m_capacity) - { - m_pool.push(p); - } - else - { - #ifndef NDEBUG - --m_pointerCount; - #endif - delete p; - } - - assert(m_pool.size() <= m_capacity); - } - - uint32_t getCapacity() const { return m_capacity; } - void setCapacity(uint32_t c) - { - assert (c >= 0); - m_capacity = c; - } - - private: - uint32_t m_capacity; - std::stack m_pool; - - #ifndef NDEBUG - public: - uint64_t m_hits; - uint64_t m_misses; - uint64_t m_pointerCount; - #endif - }; -} - diff --git a/support/spatialindex/include/spatialindex/tools/PoolPointer.h b/support/spatialindex/include/spatialindex/tools/PoolPointer.h deleted file mode 100644 index c7c2caf6..00000000 --- a/support/spatialindex/include/spatialindex/tools/PoolPointer.h +++ /dev/null @@ -1,102 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2004, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -#include "PointerPool.h" - -namespace Tools -{ - template class PointerPool; - - template class PoolPointer - { - public: - explicit PoolPointer(X* p = 0) : m_pointer(p), m_pPool(0) { m_prev = m_next = this; } - explicit PoolPointer(X* p, PointerPool* pPool) throw() : m_pointer(p), m_pPool(pPool) { m_prev = m_next = this; } - ~PoolPointer() { release(); } - PoolPointer(const PoolPointer& p) throw() { acquire(p); } - PoolPointer& operator=(const PoolPointer& p) - { - if (this != &p) - { - release(); - acquire(p); - } - return *this; - } - - X& operator*() const throw() { return *m_pointer; } - X* operator->() const throw() { return m_pointer; } - X* get() const throw() { return m_pointer; } - bool unique() const throw() { return m_prev ? m_prev == this : true; } - void relinquish() throw() - { - m_pPool = 0; - m_pointer = 0; - release(); - } - - private: - X* m_pointer; - mutable const PoolPointer* m_prev; - mutable const PoolPointer* m_next; - PointerPool* m_pPool; - - void acquire(const PoolPointer& p) throw() - { - m_pPool = p.m_pPool; - m_pointer = p.m_pointer; - m_next = p.m_next; - m_next->m_prev = this; - m_prev = &p; - #ifndef mutable - p.m_next = this; - #else - (const_cast*>(&p))->m_next = this; - #endif - } - - void release() - { - if (unique()) - { - if (m_pPool != 0) m_pPool->release(m_pointer); - else delete m_pointer; - } - else - { - m_prev->m_next = m_next; - m_next->m_prev = m_prev; - m_prev = m_next = 0; - } - m_pointer = 0; - m_pPool = 0; - } - }; -} - diff --git a/support/spatialindex/include/spatialindex/tools/SmartPointer.h b/support/spatialindex/include/spatialindex/tools/SmartPointer.h deleted file mode 100644 index 9a5c2ccb..00000000 --- a/support/spatialindex/include/spatialindex/tools/SmartPointer.h +++ /dev/null @@ -1,84 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2004, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - -namespace Tools -{ - template class SmartPointer - { - public: - explicit SmartPointer(X* p = 0) throw() : m_pointer(p) { m_prev = m_next = this; } - ~SmartPointer() { release(); } - SmartPointer(const SmartPointer& p) throw() { acquire(p); } - SmartPointer& operator=(const SmartPointer& p) - { - if (this != &p) - { - release(); - acquire(p); - } - return *this; - } - - X& operator*() const throw() { return *m_pointer; } - X* operator->() const throw() { return m_pointer; } - X* get() const throw() { return m_pointer; } - bool unique() const throw() { return m_prev ? m_prev == this : true; } - - private: - X* m_pointer; - mutable const SmartPointer* m_prev; - mutable const SmartPointer* m_next; - - void acquire(const SmartPointer& p) throw() - { - m_pointer = p.m_pointer; - m_next = p.m_next; - m_next->m_prev = this; - m_prev = &p; - #ifndef mutable - p.m_next = this; - #else - (const_cast*>(&p))->m_next = this; - #endif - } - - void release() - { - if (unique()) delete m_pointer; - else - { - m_prev->m_next = m_next; - m_next->m_prev = m_prev; - m_prev = m_next = 0; - } - m_pointer = 0; - } - }; -} - diff --git a/support/spatialindex/include/spatialindex/tools/Tools.h b/support/spatialindex/include/spatialindex/tools/Tools.h deleted file mode 100644 index 32a9801e..00000000 --- a/support/spatialindex/include/spatialindex/tools/Tools.h +++ /dev/null @@ -1,497 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Marios Hadjieleftheriou, mhadji@gmail.com - ****************************************************************************** - * Copyright (c) 2004, Marios Hadjieleftheriou - * - * 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. -******************************************************************************/ - -#pragma once - - -#if (defined _WIN32 || defined _WIN64 || defined WIN32 || defined WIN64) && !defined __GNUC__ - typedef __int8 int8_t; - typedef __int16 int16_t; - typedef __int32 int32_t; - typedef __int64 int64_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int64 uint64_t; - -// Nuke this annoying warning. See http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html -#pragma warning( disable: 4251 ) - -#else - #include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -// #include -// #include -// #include - -#if HAVE_PTHREAD_H - #include -#endif - -#include "SmartPointer.h" -#include "PointerPool.h" -#include "PoolPointer.h" - -typedef uint8_t byte; - -namespace Tools -{ - enum IntervalType - { - IT_RIGHTOPEN = 0x0, - IT_LEFTOPEN, - IT_OPEN, - IT_CLOSED - }; - - enum VariantType - { - VT_LONG = 0x0, - VT_BYTE, - VT_SHORT, - VT_FLOAT, - VT_DOUBLE, - VT_CHAR, - VT_USHORT, - VT_ULONG, - VT_INT, - VT_UINT, - VT_BOOL, - VT_PCHAR, - VT_PVOID, - VT_EMPTY, - VT_LONGLONG, - VT_ULONGLONG - }; - - enum FileMode - { - APPEND = 0x0, - CREATE - }; - - // - // Exceptions - // - class Exception - { - public: - virtual std::string what() = 0; - virtual ~Exception() {} - }; - - class IndexOutOfBoundsException : public Exception - { - public: - IndexOutOfBoundsException(size_t i); - virtual ~IndexOutOfBoundsException() {} - virtual std::string what(); - - private: - std::string m_error; - }; // IndexOutOfBoundsException - - class IllegalArgumentException : public Exception - { - public: - IllegalArgumentException(std::string s); - virtual ~IllegalArgumentException() {} - virtual std::string what(); - - private: - std::string m_error; - }; // IllegalArgumentException - - class IllegalStateException : public Exception - { - public: - IllegalStateException(std::string s); - virtual ~IllegalStateException() {} - virtual std::string what(); - - private: - std::string m_error; - }; // IllegalStateException - - class EndOfStreamException : public Exception - { - public: - EndOfStreamException(std::string s); - virtual ~EndOfStreamException() {} - virtual std::string what(); - - private: - std::string m_error; - }; // EndOfStreamException - - class ResourceLockedException : public Exception - { - public: - ResourceLockedException(std::string s); - virtual ~ResourceLockedException() {} - virtual std::string what(); - - private: - std::string m_error; - }; // ResourceLockedException - - class NotSupportedException : public Exception - { - public: - NotSupportedException(std::string s); - virtual ~NotSupportedException() {} - virtual std::string what(); - - private: - std::string m_error; - }; // NotSupportedException - - // - // Interfaces - // - class IInterval - { - public: - virtual ~IInterval() {} - - virtual double getLowerBound() const = 0; - virtual double getUpperBound() const = 0; - virtual void setBounds(double, double) = 0; - virtual bool intersectsInterval(const IInterval&) const = 0; - virtual bool intersectsInterval(IntervalType type, const double start, const double end) const = 0; - virtual bool containsInterval(const IInterval&) const = 0; - virtual IntervalType getIntervalType() const = 0; - }; // IInterval - - class IObject - { - public: - virtual ~IObject() {} - - virtual IObject* clone() = 0; - // return a new object that is an exact copy of this one. - // IMPORTANT: do not return the this pointer! - }; // IObject - - class ISerializable - { - public: - virtual ~ISerializable() {} - - virtual uint32_t getByteArraySize() = 0; - // returns the size of the required byte array. - virtual void loadFromByteArray(const byte* data) = 0; - // load this object using the byte array. - virtual void storeToByteArray(byte** data, uint32_t& length) = 0; - // store this object in the byte array. - }; - - class IComparable - { - public: - virtual ~IComparable() {} - - virtual bool operator<(const IComparable& o) const = 0; - virtual bool operator>(const IComparable& o) const = 0; - virtual bool operator==(const IComparable& o) const = 0; - }; //IComparable - - class IObjectComparator - { - public: - virtual ~IObjectComparator() {} - - virtual int compare(IObject* o1, IObject* o2) = 0; - }; // IObjectComparator - - class IObjectStream - { - public: - virtual ~IObjectStream() {} - - virtual IObject* getNext() = 0; - // returns a pointer to the next entry in the - // stream or 0 at the end of the stream. - - virtual bool hasNext() = 0; - // returns true if there are more items in the stream. - - virtual uint32_t size() = 0; - // returns the total number of entries available in the stream. - - virtual void rewind() = 0; - // sets the stream pointer to the first entry, if possible. - }; // IObjectStream - - // - // Classes & Functions - // - - class Variant - { - public: - Variant(); - - VariantType m_varType; - - union - { - int16_t iVal; // VT_SHORT - int32_t lVal; // VT_LONG - int64_t llVal; // VT_LONGLONG - byte bVal; // VT_BYTE - float fltVal; // VT_FLOAT - double dblVal; // VT_DOUBLE - char cVal; // VT_CHAR - uint16_t uiVal; // VT_USHORT - uint32_t ulVal; // VT_ULONG - uint64_t ullVal; // VT_ULONGLONG - bool blVal; // VT_BOOL - char* pcVal; // VT_PCHAR - void* pvVal; // VT_PVOID - } m_val; - }; // Variant - - class PropertySet; - std::ostream& operator<<(std::ostream& os, const Tools::PropertySet& p); - - class PropertySet : public ISerializable - { - public: - PropertySet(); - PropertySet(const byte* data); - virtual ~PropertySet(); - - Variant getProperty(std::string property); - void setProperty(std::string property, Variant& v); - void removeProperty(std::string property); - - virtual uint32_t getByteArraySize(); - virtual void loadFromByteArray(const byte* data); - virtual void storeToByteArray(byte** data, uint32_t& length); - - private: - std::map m_propertySet; -#ifdef HAVE_PTHREAD_H - pthread_rwlock_t m_rwLock; -#else - bool m_rwLock; -#endif - friend std::ostream& Tools::operator<<(std::ostream& os, const Tools::PropertySet& p); - }; // PropertySet - - // does not support degenerate intervals. - class Interval : public IInterval - { - public: - Interval(); - Interval(IntervalType, double, double); - Interval(double, double); - Interval(const Interval&); - virtual ~Interval() {} - virtual IInterval& operator=(const IInterval&); - - virtual bool operator==(const Interval&) const; - virtual bool operator!=(const Interval&) const; - virtual double getLowerBound() const; - virtual double getUpperBound() const; - virtual void setBounds(double, double); - virtual bool intersectsInterval(const IInterval&) const; - virtual bool intersectsInterval(IntervalType type, const double start, const double end) const; - virtual bool containsInterval(const IInterval&) const; - virtual IntervalType getIntervalType() const; - - IntervalType m_type; - double m_low; - double m_high; - }; // Interval - - std::ostream& operator<<(std::ostream& os, const Tools::Interval& iv); - - class Random - { - public: - Random(); - Random(uint32_t seed, uint16_t xsubi0); - virtual ~Random(); - - int32_t nextUniformLong(); - // returns a uniformly distributed long. - uint32_t nextUniformUnsignedLong(); - // returns a uniformly distributed unsigned long. - int32_t nextUniformLong(int32_t low, int32_t high); - // returns a uniformly distributed long in the range [low, high). - uint32_t nextUniformUnsignedLong(uint32_t low, uint32_t high); - // returns a uniformly distributed unsigned long in the range [low, high). - int64_t nextUniformLongLong(); - // returns a uniformly distributed long long. - uint64_t nextUniformUnsignedLongLong(); - // returns a uniformly distributed unsigned long long. - int64_t nextUniformLongLong(int64_t low, int64_t high); - // returns a uniformly distributed unsigned long long in the range [low, high). - uint64_t nextUniformUnsignedLongLong(uint64_t low, uint64_t high); - // returns a uniformly distributed unsigned long long in the range [low, high). - int16_t nextUniformShort(); - // returns a uniformly distributed short. - uint16_t nextUniformUnsignedShort(); - // returns a uniformly distributed unsigned short. - double nextUniformDouble(); - // returns a uniformly distributed double in the range [0, 1). - double nextUniformDouble(double low, double high); - // returns a uniformly distributed double in the range [low, high). - - bool flipCoin(); - - private: - void initDrand(uint32_t seed, uint16_t xsubi0); - - uint16_t* m_pBuffer; - }; // Random - - #if HAVE_PTHREAD_H - class LockGuard - { - public: - LockGuard(pthread_mutex_t* pLock); - ~LockGuard(); - - private: - pthread_mutex_t* m_pLock; - }; // LockGuard - #endif - - class BufferedFile - { - public: - BufferedFile(uint32_t u32BufferSize = 16384); - virtual ~BufferedFile(); - - virtual void close(); - virtual bool eof(); - virtual void rewind() = 0; - virtual void seek(std::fstream::off_type offset) = 0; - - protected: - std::fstream m_file; - char* m_buffer; - uint32_t m_u32BufferSize; - bool m_bEOF; - }; - - class BufferedFileReader : public BufferedFile - { - public: - BufferedFileReader(); - BufferedFileReader(const std::string& sFileName, uint32_t u32BufferSize = 32768); - virtual ~BufferedFileReader(); - - virtual void open(const std::string& sFileName); - virtual void rewind(); - virtual void seek(std::fstream::off_type offset); - - virtual uint8_t readUInt8(); - virtual uint16_t readUInt16(); - virtual uint32_t readUInt32(); - virtual uint64_t readUInt64(); - virtual float readFloat(); - virtual double readDouble(); - virtual bool readBoolean(); - virtual std::string readString(); - virtual void readBytes(uint32_t u32Len, byte** pData); - }; - - class BufferedFileWriter : public BufferedFile - { - public: - BufferedFileWriter(); - BufferedFileWriter(const std::string& sFileName, FileMode mode = CREATE, uint32_t u32BufferSize = 32768); - virtual ~BufferedFileWriter(); - - virtual void open(const std::string& sFileName, FileMode mode = CREATE); - virtual void rewind(); - virtual void seek(std::fstream::off_type offset); - - virtual void write(uint8_t i); - virtual void write(uint16_t i); - virtual void write(uint32_t i); - virtual void write(uint64_t i); - virtual void write(float i); - virtual void write(double i); - virtual void write(bool b); - virtual void write(const std::string& s); - virtual void write(uint32_t u32Len, byte* pData); - }; - - class TemporaryFile - { - public: - TemporaryFile(); - virtual ~TemporaryFile(); - - void rewindForReading(); - void rewindForWriting(); - bool eof(); - std::string getFileName() const; - - uint8_t readUInt8(); - uint16_t readUInt16(); - uint32_t readUInt32(); - uint64_t readUInt64(); - float readFloat(); - double readDouble(); - std::string readString(); - void readBytes(uint32_t u32Len, byte** pData); - - void write(uint8_t i); - void write(uint16_t i); - void write(uint32_t i); - void write(uint64_t i); - void write(float i); - void write(double i); - void write(const std::string& s); - void write(uint32_t u32Len, byte* pData); - - private: - std::string m_sFile; - BufferedFile* m_pFile; - }; -} diff --git a/support/spatialindex/include/spatialindex/tools/rand48.h b/support/spatialindex/include/spatialindex/tools/rand48.h deleted file mode 100644 index f9cf2bb4..00000000 --- a/support/spatialindex/include/spatialindex/tools/rand48.h +++ /dev/null @@ -1,85 +0,0 @@ -/****************************************************************************** - * Project: libspatialindex - A C++ library for spatial indexing - * Author: Howard Butler, hobu.inc@gmail.com - ****************************************************************************** - * Copyright (c) 2011, Howard Butler - * - * 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. -******************************************************************************/ - - -#pragma once - -/* Only define this stuff if we're not ANDROID */ -#ifndef ANDROID - -#ifndef HAVE_SRAND48 - -#if HAVE_FEATURES_H -#include -#ifndef __THROW -/* copy-pasted from sys/cdefs.h */ -/* GCC can always grok prototypes. For C++ programs we add throw() -to help it optimize the function calls. But this works only with -gcc 2.8.x and egcs. For gcc 3.2 and up we even mark C functions -as non-throwing using a function attribute since programs can use -the -fexceptions options for C code as well. */ -# if !defined __cplusplus && __GNUC_PREREQ (3, 3) -# define __THROW __attribute__ ((__nothrow__)) -# define __NTH(fct) __attribute__ ((__nothrow__)) fct -# else -# if defined __cplusplus && __GNUC_PREREQ (2,8) -# define __THROW throw () -# define __NTH(fct) fct throw () -# else -# define __THROW -# define __NTH(fct) fct -# endif -# endif - -#endif -#else -# define __THROW -# define __NTH(fct) fct -#endif - -extern void srand48(long int seed) __THROW; - -extern unsigned short *seed48(unsigned short xseed[3]) __THROW; - -extern long nrand48(unsigned short xseed[3]) __THROW; - -extern long mrand48(void) __THROW; - -extern long lrand48(void) __THROW; - -extern void lcong48(unsigned short p[7]) __THROW; - -extern long jrand48(unsigned short xseed[3]) __THROW; - -extern double erand48(unsigned short xseed[3]) __THROW; - -extern double drand48(void) __THROW; - -#endif - -/* Only define this stuff if we're not ANDROID */ -#endif \ No newline at end of file diff --git a/support/spatialindex/spatialindex-vc/spatialindex.vcxproj b/support/spatialindex/spatialindex-vc/spatialindex.vcxproj index 95219efc..45e57277 100644 --- a/support/spatialindex/spatialindex-vc/spatialindex.vcxproj +++ b/support/spatialindex/spatialindex-vc/spatialindex.vcxproj @@ -71,11 +71,11 @@ <_ProjectFileVersion>12.0.21005.1 - $(SolutionDir)..\lib\$(Platform)\ + $(SolutionDir)lib\$(PlatformToolset)\$(Platform)\ $(ProjectDir)$(Platform)\$(Configuration)\ - $(SolutionDir)..\lib\$(Platform)\ + $(SolutionDir)lib\$(PlatformToolset)\$(Platform)\ $(ProjectDir)$(Platform)\$(Configuration)\ diff --git a/support/spatialindex/src/CMakeLists.txt b/support/spatialindex/src/CMakeLists.txt index a9174392..61e16912 100644 --- a/support/spatialindex/src/CMakeLists.txt +++ b/support/spatialindex/src/CMakeLists.txt @@ -15,143 +15,143 @@ # SIDX__CPP - all the .cpp files for the given subdir/namespace # ... -set(SIDX_HEADERS_DIR ${PROJECT_SOURCE_DIR}/include/spatialindex/) -set(SIDX_HEADERS_CAPI_DIR ${PROJECT_SOURCE_DIR}/include/spatialindex/capi) +set(SIDX_HEADERS_DIR "${PROJECT_SOURCE_DIR}/include/spatialindex/") +set(SIDX_HEADERS_CAPI_DIR "${PROJECT_SOURCE_DIR}/include/spatialindex/capi") set(SIDX_HPP "") set(SIDX_CPP "") -set(SIDX_SRC_DIR ${PROJECT_SOURCE_DIR}/src) -set(SIDX_CAPI_DIR ${PROJECT_SOURCE_DIR}/src/capi) +set(SIDX_SRC_DIR "${PROJECT_SOURCE_DIR}/src") +set(SIDX_CAPI_DIR "${PROJECT_SOURCE_DIR}/src/capi") # # base # set(SIDX_BASE_HPP - ${SIDX_HEADERS_DIR}/LineSegment.h - ${SIDX_HEADERS_DIR}/MovingPoint.h - ${SIDX_HEADERS_DIR}/MVRTree.h - ${SIDX_HEADERS_DIR}/Point.h - ${SIDX_HEADERS_DIR}/Region.h - ${SIDX_HEADERS_DIR}/RTree.h - ${SIDX_HEADERS_DIR}/SpatialIndex.h - ${SIDX_HEADERS_DIR}/TimePoint.h - ${SIDX_HEADERS_DIR}/TimeRegion.h - ${SIDX_HEADERS_DIR}/TPRTree.h - ${SIDX_HEADERS_DIR}/Version.h + "${SIDX_HEADERS_DIR}/LineSegment.h" + "${SIDX_HEADERS_DIR}/MovingPoint.h" + "${SIDX_HEADERS_DIR}/MVRTree.h" + "${SIDX_HEADERS_DIR}/Point.h" + "${SIDX_HEADERS_DIR}/Region.h" + "${SIDX_HEADERS_DIR}/RTree.h" + "${SIDX_HEADERS_DIR}/SpatialIndex.h" + "${SIDX_HEADERS_DIR}/TimePoint.h" + "${SIDX_HEADERS_DIR}/TimeRegion.h" + "${SIDX_HEADERS_DIR}/TPRTree.h" + "${SIDX_HEADERS_DIR}/Version.h" ) list (APPEND SIDX_HPP ${SIDX_BASE_HPP} ) set(SIDX_CAPI_HPP - ${SIDX_HEADERS_CAPI_DIR}/BoundsQuery.h - ${SIDX_HEADERS_CAPI_DIR}/CountVisitor.h - ${SIDX_HEADERS_CAPI_DIR}/CustomStorage.h - ${SIDX_HEADERS_CAPI_DIR}/DataStream.h - ${SIDX_HEADERS_CAPI_DIR}/Error.h - ${SIDX_HEADERS_CAPI_DIR}/IdVisitor.h - ${SIDX_HEADERS_CAPI_DIR}/Index.h - ${SIDX_HEADERS_CAPI_DIR}/LeafQuery.h - ${SIDX_HEADERS_CAPI_DIR}/ObjVisitor.h - ${SIDX_HEADERS_CAPI_DIR}/sidx_api.h - ${SIDX_HEADERS_CAPI_DIR}/sidx_config.h - ${SIDX_HEADERS_CAPI_DIR}/sidx_impl.h - ${SIDX_HEADERS_CAPI_DIR}/Utility.h + "${SIDX_HEADERS_CAPI_DIR}/BoundsQuery.h" + "${SIDX_HEADERS_CAPI_DIR}/CountVisitor.h" + "${SIDX_HEADERS_CAPI_DIR}/CustomStorage.h" + "${SIDX_HEADERS_CAPI_DIR}/DataStream.h" + "${SIDX_HEADERS_CAPI_DIR}/Error.h" + "${SIDX_HEADERS_CAPI_DIR}/IdVisitor.h" + "${SIDX_HEADERS_CAPI_DIR}/Index.h" + "${SIDX_HEADERS_CAPI_DIR}/LeafQuery.h" + "${SIDX_HEADERS_CAPI_DIR}/ObjVisitor.h" + "${SIDX_HEADERS_CAPI_DIR}/sidx_api.h" + "${SIDX_HEADERS_CAPI_DIR}/sidx_config.h" + "${SIDX_HEADERS_CAPI_DIR}/sidx_impl.h" + "${SIDX_HEADERS_CAPI_DIR}/Utility.h" ) list (APPEND SIDX_HPP ${SIDX_CAPI_HPP} ) set(SIDX_CAPI_CPP - ${SIDX_CAPI_DIR}/BoundsQuery.cc - ${SIDX_CAPI_DIR}/CountVisitor.cc - ${SIDX_CAPI_DIR}/CustomStorage.cc - ${SIDX_CAPI_DIR}/DataStream.cc - ${SIDX_CAPI_DIR}/Error.cc - ${SIDX_CAPI_DIR}/IdVisitor.cc - ${SIDX_CAPI_DIR}/Index.cc - ${SIDX_CAPI_DIR}/LeafQuery.cc - ${SIDX_CAPI_DIR}/ObjVisitor.cc - ${SIDX_CAPI_DIR}/sidx_api.cc - ${SIDX_CAPI_DIR}/Utility.cc + "${SIDX_CAPI_DIR}/BoundsQuery.cc" + "${SIDX_CAPI_DIR}/CountVisitor.cc" + "${SIDX_CAPI_DIR}/CustomStorage.cc" + "${SIDX_CAPI_DIR}/DataStream.cc" + "${SIDX_CAPI_DIR}/Error.cc" + "${SIDX_CAPI_DIR}/IdVisitor.cc" + "${SIDX_CAPI_DIR}/Index.cc" + "${SIDX_CAPI_DIR}/LeafQuery.cc" + "${SIDX_CAPI_DIR}/ObjVisitor.cc" + "${SIDX_CAPI_DIR}/sidx_api.cc" + "${SIDX_CAPI_DIR}/Utility.cc" ) set(SIDX_SPATIALINDEX_CPP - ${SIDX_SRC_DIR}/spatialindex/LineSegment.cc - ${SIDX_SRC_DIR}/spatialindex/MovingPoint.cc - ${SIDX_SRC_DIR}/spatialindex/MovingRegion.cc - ${SIDX_SRC_DIR}/spatialindex/Point.cc - ${SIDX_SRC_DIR}/spatialindex/Region.cc - ${SIDX_SRC_DIR}/spatialindex/SpatialIndexImpl.cc - ${SIDX_SRC_DIR}/spatialindex/TimePoint.cc - ${SIDX_SRC_DIR}/spatialindex/TimeRegion.cc + "${SIDX_SRC_DIR}/spatialindex/LineSegment.cc" + "${SIDX_SRC_DIR}/spatialindex/MovingPoint.cc" + "${SIDX_SRC_DIR}/spatialindex/MovingRegion.cc" + "${SIDX_SRC_DIR}/spatialindex/Point.cc" + "${SIDX_SRC_DIR}/spatialindex/Region.cc" + "${SIDX_SRC_DIR}/spatialindex/SpatialIndexImpl.cc" + "${SIDX_SRC_DIR}/spatialindex/TimePoint.cc" + "${SIDX_SRC_DIR}/spatialindex/TimeRegion.cc" ) list (APPEND SIDX_CPP ${SIDX_SPATIALINDEX_CPP} ) set(SIDX_MVRTREE_CPP - ${SIDX_SRC_DIR}/mvrtree/Index.cc - ${SIDX_SRC_DIR}/mvrtree/Index.h - ${SIDX_SRC_DIR}/mvrtree/Leaf.cc - ${SIDX_SRC_DIR}/mvrtree/Leaf.h - ${SIDX_SRC_DIR}/mvrtree/MVRTree.cc - ${SIDX_SRC_DIR}/mvrtree/MVRTree.h - ${SIDX_SRC_DIR}/mvrtree/Node.cc - ${SIDX_SRC_DIR}/mvrtree/Node.h - ${SIDX_SRC_DIR}/mvrtree/PointerPoolNode.h - ${SIDX_SRC_DIR}/mvrtree/Statistics.cc - ${SIDX_SRC_DIR}/mvrtree/Statistics.h + "${SIDX_SRC_DIR}/mvrtree/Index.cc" + "${SIDX_SRC_DIR}/mvrtree/Index.h" + "${SIDX_SRC_DIR}/mvrtree/Leaf.cc" + "${SIDX_SRC_DIR}/mvrtree/Leaf.h" + "${SIDX_SRC_DIR}/mvrtree/MVRTree.cc" + "${SIDX_SRC_DIR}/mvrtree/MVRTree.h" + "${SIDX_SRC_DIR}/mvrtree/Node.cc" + "${SIDX_SRC_DIR}/mvrtree/Node.h" + "${SIDX_SRC_DIR}/mvrtree/PointerPoolNode.h" + "${SIDX_SRC_DIR}/mvrtree/Statistics.cc" + "${SIDX_SRC_DIR}/mvrtree/Statistics.h" ) list (APPEND SIDX_CPP ${SIDX_MVRTREE_CPP}) set(SIDX_RTREE_CPP - ${SIDX_SRC_DIR}/rtree/BulkLoader.cc - ${SIDX_SRC_DIR}/rtree/BulkLoader.h - ${SIDX_SRC_DIR}/rtree/Index.cc - ${SIDX_SRC_DIR}/rtree/Index.h - ${SIDX_SRC_DIR}/rtree/Leaf.cc - ${SIDX_SRC_DIR}/rtree/Leaf.h - ${SIDX_SRC_DIR}/rtree/Node.cc - ${SIDX_SRC_DIR}/rtree/Node.h - ${SIDX_SRC_DIR}/rtree/PointerPoolNode.h - ${SIDX_SRC_DIR}/rtree/RTree.cc - ${SIDX_SRC_DIR}/rtree/RTree.h - ${SIDX_SRC_DIR}/rtree/Statistics.cc - ${SIDX_SRC_DIR}/rtree/Statistics.h + "${SIDX_SRC_DIR}/rtree/BulkLoader.cc" + "${SIDX_SRC_DIR}/rtree/BulkLoader.h" + "${SIDX_SRC_DIR}/rtree/Index.cc" + "${SIDX_SRC_DIR}/rtree/Index.h" + "${SIDX_SRC_DIR}/rtree/Leaf.cc" + "${SIDX_SRC_DIR}/rtree/Leaf.h" + "${SIDX_SRC_DIR}/rtree/Node.cc" + "${SIDX_SRC_DIR}/rtree/Node.h" + "${SIDX_SRC_DIR}/rtree/PointerPoolNode.h" + "${SIDX_SRC_DIR}/rtree/RTree.cc" + "${SIDX_SRC_DIR}/rtree/RTree.h" + "${SIDX_SRC_DIR}/rtree/Statistics.cc" + "${SIDX_SRC_DIR}/rtree/Statistics.h" ) list (APPEND SIDX_CPP ${SIDX_RTREE_CPP}) set(SIDX_STORAGEMANAGER_CPP - ${SIDX_SRC_DIR}/storagemanager/Buffer.cc - ${SIDX_SRC_DIR}/storagemanager/DiskStorageManager.cc - ${SIDX_SRC_DIR}/storagemanager/DiskStorageManager.h - ${SIDX_SRC_DIR}/storagemanager/MemoryStorageManager.cc - ${SIDX_SRC_DIR}/storagemanager/MemoryStorageManager.h - ${SIDX_SRC_DIR}/storagemanager/RandomEvictionsBuffer.cc - ${SIDX_SRC_DIR}/storagemanager/RandomEvictionsBuffer.h + "${SIDX_SRC_DIR}/storagemanager/Buffer.cc" + "${SIDX_SRC_DIR}/storagemanager/DiskStorageManager.cc" + "${SIDX_SRC_DIR}/storagemanager/DiskStorageManager.h" + "${SIDX_SRC_DIR}/storagemanager/MemoryStorageManager.cc" + "${SIDX_SRC_DIR}/storagemanager/MemoryStorageManager.h" + "${SIDX_SRC_DIR}/storagemanager/RandomEvictionsBuffer.cc" + "${SIDX_SRC_DIR}/storagemanager/RandomEvictionsBuffer.h" ) list (APPEND SIDX_CPP ${SIDX_STORAGEMANAGER_CPP}) set(SIDX_RAND48 ) if (NOT HAVE_SRAND48) - set(SIDX_RAND48 ${SIDX_SRC_DIR}/tools/rand48.cc) + set(SIDX_RAND48 "${SIDX_SRC_DIR}/tools/rand48.cc") endif() set(SIDX_TOOLS_CPP ${SIDX_RAND48} - ${SIDX_SRC_DIR}/tools/Tools.cc + "${SIDX_SRC_DIR}/tools/Tools.cc" ) list (APPEND SIDX_CPP ${SIDX_TOOLS_CPP}) set(SIDX_TOOLS_CPP - ${SIDX_SRC_DIR}/tprtree/Index.cc - ${SIDX_SRC_DIR}/tprtree/Index.h - ${SIDX_SRC_DIR}/tprtree/Leaf.cc - ${SIDX_SRC_DIR}/tprtree/Leaf.h - ${SIDX_SRC_DIR}/tprtree/Node.cc - ${SIDX_SRC_DIR}/tprtree/Node.h - ${SIDX_SRC_DIR}/tprtree/PointerPoolNode.h - ${SIDX_SRC_DIR}/tprtree/Statistics.cc - ${SIDX_SRC_DIR}/tprtree/Statistics.h - ${SIDX_SRC_DIR}/tprtree/TPRTree.cc - ${SIDX_SRC_DIR}/tprtree/TPRTree.h + "${SIDX_SRC_DIR}/tprtree/Index.cc" + "${SIDX_SRC_DIR}/tprtree/Index.h" + "${SIDX_SRC_DIR}/tprtree/Leaf.cc" + "${SIDX_SRC_DIR}/tprtree/Leaf.h" + "${SIDX_SRC_DIR}/tprtree/Node.cc" + "${SIDX_SRC_DIR}/tprtree/Node.h" + "${SIDX_SRC_DIR}/tprtree/PointerPoolNode.h" + "${SIDX_SRC_DIR}/tprtree/Statistics.cc" + "${SIDX_SRC_DIR}/tprtree/Statistics.h" + "${SIDX_SRC_DIR}/tprtree/TPRTree.cc" + "${SIDX_SRC_DIR}/tprtree/TPRTree.h" ) list (APPEND SIDX_CPP ${SIDX_TOOLS_CPP} ) # @@ -190,7 +190,7 @@ set(SIDX_SOURCES if(WIN32) add_definitions("-DSIDX_DLL_EXPORT=1") if (NOT WITH_STATIC_LASZIP) - add_definitions("-DLASZIP_DLL_IMPORT=1") + add_definitions("-DSIDX_DLL_IMPORT=1") endif() endif() @@ -205,10 +205,12 @@ target_link_libraries(${SIDX_C_LIB_NAME} set_target_properties(${SIDX_LIB_NAME} - PROPERTIES SOVERSION "${SIDX_LIB_SOVERSION}" ) + PROPERTIES VERSION "${SIDX_LIB_VERSION}" + SOVERSION "${SIDX_LIB_SOVERSION}" ) -set_target_properties(${SIDX_C_LIB_NAME} - PROPERTIES SOVERSION "${SIDX_LIB_SOVERSION}" ) +set_target_properties(${SIDX_C_LIB_NAME} + PROPERTIES VERSION "${SIDX_LIB_VERSION}" + SOVERSION "${SIDX_LIB_SOVERSION}" ) @@ -216,12 +218,12 @@ if (APPLE) set_target_properties( ${SIDX_LIB_NAME} PROPERTIES - INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib") + INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib" BUILD_WITH_INSTALL_RPATH OFF) set_target_properties( ${SIDX_C_LIB_NAME} PROPERTIES - INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib") + INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib" BUILD_WITH_INSTALL_RPATH OFF) endif() ############################################################################### diff --git a/support/spatialindex/src/Makefile.in b/support/spatialindex/src/Makefile.in deleted file mode 100644 index db4341c9..00000000 --- a/support/spatialindex/src/Makefile.in +++ /dev/null @@ -1,636 +0,0 @@ -# Makefile.in generated by automake 1.13.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2012 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@ -am__make_dryrun = \ - { \ - am__dry=no; \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ - esac; \ - test $$am__dry = yes; \ - } -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@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@ -subdir = src -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/mkinstalldirs $(srcdir)/libspatialindex.pc.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_CLEAN_FILES = libspatialindex.pc -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-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 \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -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 = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(pkgconfigdir)" -DATA = $(pkgconfig_DATA) -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - distdir -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -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@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = storagemanager spatialindex rtree mvrtree tprtree tools capi -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libspatialindex.pc -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 ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu 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 -$(am__aclocal_m4_deps): -libspatialindex.pc: $(top_builddir)/config.status $(srcdir)/libspatialindex.pc.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-pkgconfigDATA: $(pkgconfig_DATA) - @$(NORMAL_INSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ - fi; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ - done - -uninstall-pkgconfigDATA: - @$(NORMAL_UNINSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) - -# 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. -$(am__recursive_targets): - @fail= 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//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - 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; \ - ($(am__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" - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - 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 || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -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 "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$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 \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile $(DATA) -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(pkgconfigdir)"; 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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: install-pkgconfigDATA - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -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 mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-pkgconfigDATA - -.MAKE: $(am__recursive_targets) install-am install-strip - -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ - check-am clean clean-generic clean-libtool cscopelist-am ctags \ - ctags-am distclean distclean-generic distclean-libtool \ - 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-pkgconfigDATA install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-pkgconfigDATA - - -# 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/support/spatialindex/src/capi/BoundsQuery.cc b/support/spatialindex/src/capi/BoundsQuery.cc index a544a9ef..177bc44c 100644 --- a/support/spatialindex/src/capi/BoundsQuery.cc +++ b/support/spatialindex/src/capi/BoundsQuery.cc @@ -34,7 +34,7 @@ BoundsQuery::BoundsQuery() } void BoundsQuery::getNextEntry( const SpatialIndex::IEntry& entry, - SpatialIndex::id_type& nextEntry, + SpatialIndex::id_type&, bool& hasNext) { SpatialIndex::IShape* ps; diff --git a/support/spatialindex/src/capi/CountVisitor.cc b/support/spatialindex/src/capi/CountVisitor.cc index fdda4457..aadef215 100644 --- a/support/spatialindex/src/capi/CountVisitor.cc +++ b/support/spatialindex/src/capi/CountVisitor.cc @@ -37,16 +37,16 @@ CountVisitor::~CountVisitor() } -void CountVisitor::visitNode(const SpatialIndex::INode& n) +void CountVisitor::visitNode(const SpatialIndex::INode& ) { } -void CountVisitor::visitData(const SpatialIndex::IData& d) +void CountVisitor::visitData(const SpatialIndex::IData& ) { nResults += 1; } -void CountVisitor::visitData(std::vector& v) +void CountVisitor::visitData(std::vector& ) { } diff --git a/support/spatialindex/src/capi/DataStream.cc b/support/spatialindex/src/capi/DataStream.cc index 4249c3d9..18eebab0 100644 --- a/support/spatialindex/src/capi/DataStream.cc +++ b/support/spatialindex/src/capi/DataStream.cc @@ -6,7 +6,7 @@ * Copyright (c) 2009, Howard Butler * * 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 @@ -29,17 +29,17 @@ #include -DataStream::DataStream(int (*readNext)(SpatialIndex::id_type * id, - double **pMin, - double **pMax, - uint32_t *nDimension, - const uint8_t** pData, - uint32_t *nDataLength) ) +DataStream::DataStream(int (*readNext)(SpatialIndex::id_type * id, + double **pMin, + double **pMax, + uint32_t *nDimension, + const uint8_t** pData, + size_t *nDataLength) ) : m_pNext(0), m_bDoneReading(false) { iterfunct = readNext; - + // Read the first one. readData(); } @@ -56,24 +56,24 @@ bool DataStream::readData() double *pMax=0; uint32_t nDimension=0; uint8_t *p_data=0; - uint32_t nDataLength=0; - + size_t nDataLength=0; + if (m_bDoneReading == true) { return false; } - + int ret = iterfunct(&id, &pMin, &pMax, &nDimension, const_cast(&p_data), &nDataLength); - // The callback should return anything other than 0 + // The callback should return anything other than 0 // when it is done. - if (ret != 0) + if (ret != 0) { m_bDoneReading = true; return false; } - + SpatialIndex::Region r = SpatialIndex::Region(pMin, pMax, nDimension); - + // Data gets copied here anyway. We should fix this part of SpatialIndex::RTree::Data's constructor m_pNext = new SpatialIndex::RTree::Data(nDataLength, p_data, r, id); @@ -91,17 +91,17 @@ SpatialIndex::IData* DataStream::getNext() return ret; } -bool DataStream::hasNext() throw (Tools::NotSupportedException) +bool DataStream::hasNext() { return (m_pNext != 0); } -uint32_t DataStream::size() throw (Tools::NotSupportedException) +uint32_t DataStream::size() { throw Tools::NotSupportedException("Operation not supported."); } -void DataStream::rewind() throw (Tools::NotSupportedException) +void DataStream::rewind() { throw Tools::NotSupportedException("Operation not supported."); diff --git a/support/spatialindex/src/capi/IdVisitor.cc b/support/spatialindex/src/capi/IdVisitor.cc index b7e6f405..dc52c1c1 100644 --- a/support/spatialindex/src/capi/IdVisitor.cc +++ b/support/spatialindex/src/capi/IdVisitor.cc @@ -37,7 +37,7 @@ IdVisitor::~IdVisitor() } -void IdVisitor::visitNode(const SpatialIndex::INode& n) +void IdVisitor::visitNode(const SpatialIndex::INode& ) { } @@ -49,6 +49,6 @@ void IdVisitor::visitData(const SpatialIndex::IData& d) m_vector.push_back(d.getIdentifier()); } -void IdVisitor::visitData(std::vector& v) +void IdVisitor::visitData(std::vector& ) { } diff --git a/support/spatialindex/src/capi/Index.cc b/support/spatialindex/src/capi/Index.cc index 351ab869..2d0f9fcf 100644 --- a/support/spatialindex/src/capi/Index.cc +++ b/support/spatialindex/src/capi/Index.cc @@ -6,7 +6,7 @@ * Copyright (c) 2009, Howard Butler * * 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 @@ -28,91 +28,84 @@ #include -SpatialIndex::ISpatialIndex* Index::CreateIndex() +SpatialIndex::ISpatialIndex* Index::CreateIndex() { using namespace SpatialIndex; - + ISpatialIndex* index = 0; - + Tools::Variant var; if (GetIndexType() == RT_RTree) { try { - index = RTree::returnRTree( *m_buffer, m_properties); + index = RTree::returnRTree( *m_buffer, m_properties); } catch (Tools::Exception& e) { std::ostringstream os; os << "Spatial Index Error: " << e.what(); throw std::runtime_error(os.str()); - } + } } else if (GetIndexType() == RT_MVRTree) { try { - index = MVRTree::returnMVRTree( *m_buffer, m_properties); + index = MVRTree::returnMVRTree( *m_buffer, m_properties); } catch (Tools::Exception& e) { std::ostringstream os; os << "Spatial Index Error: " << e.what(); throw std::runtime_error(os.str()); - } + } } else if (GetIndexType() == RT_TPRTree) { try { - index = TPRTree::returnTPRTree( *m_buffer,m_properties); + index = TPRTree::returnTPRTree( *m_buffer,m_properties); } catch (Tools::Exception& e) { std::ostringstream os; os << "Spatial Index Error: " << e.what(); throw std::runtime_error(os.str()); - } + } } return index; } -Index::Index(const Tools::PropertySet& poProperties) +Index::Index(const Tools::PropertySet& poProperties): m_properties(poProperties) { Setup(); - - m_properties = poProperties; Initialize(); } -Index::~Index() +Index::~Index() { - if (m_rtree != 0) - delete m_rtree; - if (m_buffer != 0) - delete m_buffer; - if (m_storage != 0) - delete m_storage; - + delete m_rtree; + delete m_buffer; + delete m_storage; } -Index::Index( const Tools::PropertySet& poProperties, - int (*readNext)(SpatialIndex::id_type *id, - double **pMin, - double **pMax, - uint32_t *nDimension, - const uint8_t **pData, - uint32_t *nDataLength)) +Index::Index( const Tools::PropertySet& poProperties, + int (*readNext)(SpatialIndex::id_type *id, + double **pMin, + double **pMax, + uint32_t *nDimension, + const uint8_t **pData, + size_t *nDataLength)) +: m_properties(poProperties) { using namespace SpatialIndex; - + Setup(); - - m_properties = poProperties; m_storage = CreateStorage(); m_buffer = CreateIndexBuffer(*m_storage); - + DataStream ds(readNext); - + double dFillFactor = 0.7; uint32_t nIdxCapacity = 100; uint32_t nIdxLeafCap = 100; @@ -120,7 +113,7 @@ Index::Index( const Tools::PropertySet& poProperties, SpatialIndex::RTree::RTreeVariant eVariant = SpatialIndex::RTree::RV_RSTAR; SpatialIndex::id_type m_IdxIdentifier; - // Fetch a bunch of properties. We can't bulk load an rtree using merely + // Fetch a bunch of properties. We can't bulk load an rtree using merely // properties, we have to use the helper method(s). Tools::Variant var; @@ -130,17 +123,17 @@ Index::Index( const Tools::PropertySet& poProperties, if (var.m_varType != Tools::VT_DOUBLE) throw std::runtime_error("Index::Index (streaming):" " Property FillFactor must be Tools::VT_DOUBLE"); - + dFillFactor = var.m_val.dblVal; } - + var = m_properties.getProperty("IndexCapacity"); if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) throw std::runtime_error("Index::Index (streaming): " "Property IndexCapacity must be Tools::VT_ULONG"); - + nIdxCapacity = var.m_val.ulVal; } @@ -150,7 +143,7 @@ Index::Index( const Tools::PropertySet& poProperties, if (var.m_varType != Tools::VT_ULONG) throw std::runtime_error("Index::Index (streaming): " "Property LeafCapacity must be Tools::VT_ULONG"); - + nIdxLeafCap = var.m_val.ulVal; } @@ -160,7 +153,7 @@ Index::Index( const Tools::PropertySet& poProperties, if (var.m_varType != Tools::VT_ULONG) throw std::runtime_error("Index::Index (streaming): " "Property Dimension must be Tools::VT_ULONG"); - + nIdxDimension = var.m_val.ulVal; } @@ -170,7 +163,7 @@ Index::Index( const Tools::PropertySet& poProperties, if (var.m_varType != Tools::VT_LONG) throw std::runtime_error("Index::Index (streaming): " "Property TreeVariant must be Tools::VT_LONG"); - + eVariant = static_cast(var.m_val.lVal); } @@ -180,10 +173,10 @@ Index::Index( const Tools::PropertySet& poProperties, if (var.m_varType != Tools::VT_LONGLONG) throw std::runtime_error("Index::Index (streaming): " "Property IndexIdentifier must be Tools::VT_LONGLONG"); - + m_IdxIdentifier = var.m_val.llVal; } - + m_rtree = RTree::createAndBulkLoadNewRTree( SpatialIndex::RTree::BLM_STR, ds, *m_buffer, @@ -194,14 +187,14 @@ Index::Index( const Tools::PropertySet& poProperties, eVariant, m_IdxIdentifier); } - + SpatialIndex::StorageManager::IBuffer* Index::CreateIndexBuffer(SpatialIndex::IStorageManager& storage) { using namespace SpatialIndex::StorageManager; IBuffer* buffer = 0; try { - if ( m_storage == 0 ) + if ( m_storage == 0 ) throw std::runtime_error("Storage was invalid to create index buffer"); buffer = returnRandomEvictionsBuffer(storage, m_properties); } catch (Tools::Exception& e) { @@ -216,10 +209,10 @@ SpatialIndex::StorageManager::IBuffer* Index::CreateIndexBuffer(SpatialIndex::IS SpatialIndex::IStorageManager* Index::CreateStorage() { using namespace SpatialIndex::StorageManager; - + SpatialIndex::IStorageManager* storage = 0; std::string filename(""); - + Tools::Variant var; var = m_properties.getProperty("FileName"); @@ -228,10 +221,10 @@ SpatialIndex::IStorageManager* Index::CreateStorage() if (var.m_varType != Tools::VT_PCHAR) throw std::runtime_error("Index::CreateStorage: " "Property FileName must be Tools::VT_PCHAR"); - + filename = std::string(var.m_val.pcVal); } - + if (GetIndexStorage() == RT_Disk) { if (filename.empty()) { std::ostringstream os; @@ -246,7 +239,7 @@ SpatialIndex::IStorageManager* Index::CreateStorage() std::ostringstream os; os << "Spatial Index Error: " << e.what(); throw std::runtime_error(os.str()); - } + } } else if (GetIndexStorage() == RT_Memory) { @@ -257,8 +250,8 @@ SpatialIndex::IStorageManager* Index::CreateStorage() std::ostringstream os; os << "Spatial Index Error: " << e.what(); throw std::runtime_error(os.str()); - } - + } + } else if (GetIndexStorage() == RT_Custom) { try { @@ -268,10 +261,10 @@ SpatialIndex::IStorageManager* Index::CreateStorage() std::ostringstream os; os << "Spatial Index Error: " << e.what(); throw std::runtime_error(os.str()); - } - + } + } - return storage; + return storage; } @@ -286,13 +279,13 @@ void Index::Initialize() void Index::Setup() -{ +{ m_buffer = 0; m_storage = 0; m_rtree = 0; } -RTIndexType Index::GetIndexType() +RTIndexType Index::GetIndexType() { Tools::Variant var; var = m_properties.getProperty("IndexType"); @@ -302,13 +295,13 @@ RTIndexType Index::GetIndexType() if (var.m_varType != Tools::VT_ULONG) throw std::runtime_error("Index::GetIndexType: " "Property IndexType must be Tools::VT_ULONG"); - + return static_cast(var.m_val.ulVal); } - + // if we didn't get anything, we're returning an error condition return RT_InvalidIndexType; - + } void Index::SetIndexType(RTIndexType v) { @@ -329,10 +322,10 @@ RTStorageType Index::GetIndexStorage() if (var.m_varType != Tools::VT_ULONG) throw std::runtime_error("Index::GetIndexStorage: " "Property IndexStorageType must be Tools::VT_ULONG"); - + return static_cast(var.m_val.ulVal); } - + // if we didn't get anything, we're returning an error condition return RT_InvalidStorageType; } @@ -356,10 +349,10 @@ RTIndexVariant Index::GetIndexVariant() if (var.m_varType != Tools::VT_ULONG) throw std::runtime_error("Index::GetIndexVariant: " "Property TreeVariant must be Tools::VT_ULONG"); - + return static_cast(var.m_val.ulVal); } - + // if we didn't get anything, we're returning an error condition return RT_InvalidIndexVariant; } @@ -374,9 +367,66 @@ void Index::SetIndexVariant(RTStorageType v) m_properties.setProperty("TreeVariant", var); } else if (GetIndexType() == RT_MVRTree) { var.m_val.ulVal = static_cast(v); - m_properties.setProperty("TreeVariant", var); + m_properties.setProperty("TreeVariant", var); } else if (GetIndexType() == RT_TPRTree) { var.m_val.ulVal = static_cast(v); - m_properties.setProperty("TreeVariant", var); + m_properties.setProperty("TreeVariant", var); } } + +int64_t Index::GetResultSetOffset() +{ + Tools::Variant var; + var = m_properties.getProperty("ResultSetOffset"); + + if (var.m_varType != Tools::VT_EMPTY) + { + if (var.m_varType != Tools::VT_LONGLONG) + throw std::runtime_error("Index::ResultSetOffset: " + "Property ResultSetOffset must be Tools::VT_LONGLONG"); + return var.m_val.llVal; + } + + // if we didn't get anything, we're returning 0 as there is no limit + return 0; +} + +void Index::SetResultSetOffset(int64_t v) +{ + Tools::Variant var; + var.m_varType = Tools::VT_LONGLONG; + var.m_val.llVal = v; + m_properties.setProperty("ResultSetOffset", var); +} + + +int64_t Index::GetResultSetLimit() +{ + Tools::Variant var; + var = m_properties.getProperty("ResultSetLimit"); + + if (var.m_varType != Tools::VT_EMPTY) + { + if (var.m_varType != Tools::VT_LONGLONG) + throw std::runtime_error("Index::ResultSetLimit: " + "Property ResultSetLimit must be Tools::VT_LONGLONG"); + return var.m_val.llVal; + } + + // if we didn't get anything, we're returning 0 as there is no limit + return 0; +} + +void Index::SetResultSetLimit(int64_t v) +{ + Tools::Variant var; + var.m_varType = Tools::VT_LONGLONG; + var.m_val.llVal = v; + m_properties.setProperty("ResultSetLimit", var); +} + +void Index::flush() +{ + m_rtree->flush(); + m_storage->flush(); +} diff --git a/support/spatialindex/src/capi/LeafQuery.cc b/support/spatialindex/src/capi/LeafQuery.cc index c79dbf9c..670ccf8f 100644 --- a/support/spatialindex/src/capi/LeafQuery.cc +++ b/support/spatialindex/src/capi/LeafQuery.cc @@ -41,7 +41,7 @@ LeafQueryResult get_results(const SpatialIndex::INode* n) n->getShape(&ps); SpatialIndex::Region* pr = dynamic_cast(ps); std::vector ids; - for (size_t cChild = 0; cChild < n->getChildrenCount(); cChild++) + for (uint32_t cChild = 0; cChild < n->getChildrenCount(); cChild++) { ids.push_back(n->getChildIdentifier(cChild)); } diff --git a/support/spatialindex/src/capi/Makefile.in b/support/spatialindex/src/capi/Makefile.in deleted file mode 100644 index 3336d83d..00000000 --- a/support/spatialindex/src/capi/Makefile.in +++ /dev/null @@ -1,569 +0,0 @@ -# Makefile.in generated by automake 1.13.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2012 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@ -am__make_dryrun = \ - { \ - am__dry=no; \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ - esac; \ - test $$am__dry = yes; \ - } -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@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@ -subdir = src/capi -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) -libsidxc_la_LIBADD = -am_libsidxc_la_OBJECTS = BoundsQuery.lo CountVisitor.lo \ - CustomStorage.lo DataStream.lo Error.lo IdVisitor.lo Index.lo \ - LeafQuery.lo ObjVisitor.lo sidx_api.lo Utility.lo -libsidxc_la_OBJECTS = $(am_libsidxc_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_@AM_V@) -am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo " CXX " $@; -am__v_CXX_1 = -CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ - $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) -am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo " CXXLD " $@; -am__v_CXXLD_1 = -SOURCES = $(libsidxc_la_SOURCES) -DIST_SOURCES = $(libsidxc_la_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -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@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -noinst_LTLIBRARIES = libsidxc.la -INCLUDES = -I../../include -I../../include/capi -libsidxc_la_SOURCES = BoundsQuery.cc \ - CountVisitor.cc \ - CustomStorage.cc \ - DataStream.cc \ - Error.cc \ - IdVisitor.cc \ - Index.cc \ - LeafQuery.cc \ - ObjVisitor.cc \ - sidx_api.cc \ - Utility.cc - -all: all-am - -.SUFFIXES: -.SUFFIXES: .cc .lo .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 ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/capi/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/capi/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 -$(am__aclocal_m4_deps): - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } -libsidxc.la: $(libsidxc_la_OBJECTS) $(libsidxc_la_DEPENDENCIES) $(EXTRA_libsidxc_la_DEPENDENCIES) - $(AM_V_CXXLD)$(CXXLINK) $(libsidxc_la_OBJECTS) $(libsidxc_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BoundsQuery.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CountVisitor.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CustomStorage.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DataStream.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Error.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/IdVisitor.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Index.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LeafQuery.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ObjVisitor.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Utility.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sidx_api.Plo@am__quote@ - -.cc.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< - -.cc.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cc.lo: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -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 "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$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 $(LTLIBRARIES) -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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libtool clean-noinstLTLIBRARIES \ - 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 - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -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 \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool 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 mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-am 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/support/spatialindex/src/capi/ObjVisitor.cc b/support/spatialindex/src/capi/ObjVisitor.cc index 3dd8d890..dc66b5c0 100644 --- a/support/spatialindex/src/capi/ObjVisitor.cc +++ b/support/spatialindex/src/capi/ObjVisitor.cc @@ -41,7 +41,7 @@ ObjVisitor::~ObjVisitor() } -void ObjVisitor::visitNode(const SpatialIndex::INode& n) +void ObjVisitor::visitNode(const SpatialIndex::INode& ) { } @@ -55,7 +55,7 @@ void ObjVisitor::visitData(const SpatialIndex::IData& d) m_vector.push_back(item); } -void ObjVisitor::visitData(std::vector& v) +void ObjVisitor::visitData(std::vector& ) { } diff --git a/support/spatialindex/src/capi/Utility.cc b/support/spatialindex/src/capi/Utility.cc index d33d7050..ff0160cb 100644 --- a/support/spatialindex/src/capi/Utility.cc +++ b/support/spatialindex/src/capi/Utility.cc @@ -6,7 +6,7 @@ * Copyright (c) 2009, Howard Butler * * 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 @@ -31,23 +31,23 @@ Tools::PropertySet* GetDefaults() { Tools::PropertySet* ps = new Tools::PropertySet; - + Tools::Variant var; - + // Rtree defaults - + var.m_varType = Tools::VT_DOUBLE; var.m_val.dblVal = 0.7; ps->setProperty("FillFactor", var); - + var.m_varType = Tools::VT_ULONG; var.m_val.ulVal = 100; ps->setProperty("IndexCapacity", var); - + var.m_varType = Tools::VT_ULONG; var.m_val.ulVal = 100; ps->setProperty("LeafCapacity", var); - + var.m_varType = Tools::VT_LONG; var.m_val.lVal = SpatialIndex::RTree::RV_RSTAR; ps->setProperty("TreeVariant", var); @@ -55,11 +55,11 @@ Tools::PropertySet* GetDefaults() // var.m_varType = Tools::VT_LONGLONG; // var.m_val.llVal = 0; // ps->setProperty("IndexIdentifier", var); - + var.m_varType = Tools::VT_ULONG; var.m_val.ulVal = 32; ps->setProperty("NearMinimumOverlapFactor", var); - + var.m_varType = Tools::VT_DOUBLE; var.m_val.dblVal = 0.4; ps->setProperty("SplitDistributionFactor", var); @@ -71,15 +71,15 @@ Tools::PropertySet* GetDefaults() var.m_varType = Tools::VT_ULONG; var.m_val.ulVal = 2; ps->setProperty("Dimension", var); - + var.m_varType = Tools::VT_BOOL; var.m_val.bVal = true; ps->setProperty("EnsureTightMBRs", var); - + var.m_varType = Tools::VT_ULONG; var.m_val.ulVal = 100; ps->setProperty("IndexPoolCapacity", var); - + var.m_varType = Tools::VT_ULONG; var.m_val.ulVal = 100; ps->setProperty("LeafPoolCapacity", var); @@ -96,30 +96,34 @@ Tools::PropertySet* GetDefaults() var.m_varType = Tools::VT_DOUBLE; var.m_val.dblVal = 20.0; ps->setProperty("Horizon", var); - + // Buffering defaults var.m_varType = Tools::VT_ULONG; var.m_val.ulVal = 10; ps->setProperty("Capacity", var); - + var.m_varType = Tools::VT_BOOL; var.m_val.bVal = false; ps->setProperty("WriteThrough", var); - + // Disk Storage Manager defaults var.m_varType = Tools::VT_BOOL; var.m_val.bVal = true; ps->setProperty("Overwrite", var); - + var.m_varType = Tools::VT_PCHAR; var.m_val.pcVal = const_cast(""); ps->setProperty("FileName", var); - + var.m_varType = Tools::VT_ULONG; var.m_val.ulVal = 4096; ps->setProperty("PageSize", var); - - // Our custom properties related to whether + + var.m_varType = Tools::VT_LONGLONG; + var.m_val.llVal = 0; + ps->setProperty("ResultSetLimit", var); + + // Our custom properties related to whether // or not we are using a disk or memory storage manager var.m_varType = Tools::VT_ULONG; @@ -149,3 +153,83 @@ Tools::PropertySet* GetDefaults() return ps; } + +void Page_ResultSet_Ids(IdVisitor& visitor, int64_t** ids, int64_t nStart, int64_t nResultLimit, uint64_t* nResults) +{ + int64_t nResultCount; + + nResultCount = visitor.GetResultCount(); + + if (nResultLimit == 0) + { + // no offset paging + nResultLimit = nResultCount; + nStart = 0; + } + else + { + if ((nResultCount - (nStart + nResultLimit)) < 0) + { + // not enough results to fill nResultCount + nStart = std::min(nStart, nResultCount); + nResultCount = nStart + std::min(nResultLimit, nResultCount - nStart); + } + else + { + nResultCount = std::min(nResultCount, nStart + nResultLimit); + } + } + + *ids = (int64_t*) malloc (nResultLimit * sizeof(int64_t)); + + std::vector& results = visitor.GetResults(); + + for (int64_t i = nStart; i < nResultCount; ++i) + { + (*ids)[i - nStart] = results[i]; + } + + *nResults = nResultCount - nStart; +} + +void Page_ResultSet_Obj(ObjVisitor& visitor, IndexItemH** items, int64_t nStart, int64_t nResultLimit, uint64_t* nResults) +{ + int64_t nResultCount; + + nResultCount = visitor.GetResultCount(); + + if (nResultLimit == 0) + { + // no offset paging + nResultLimit = nResultCount; + nStart = 0; + } + else + { + if ((nResultCount - (nStart + nResultLimit)) < 0) + { + // not enough results to fill nResultCount + nStart = std::min(nStart, nResultCount); + nResultCount = nStart + std::min(nResultLimit, nResultCount - nStart); + } + else + { + nResultCount = std::min(nResultCount, nStart + nResultLimit); + } + } + + *items = (IndexItemH*) malloc (nResultLimit * sizeof(SpatialIndex::IData*)); + + std::vector& results = visitor.GetResults(); + + // copy the Items into the newly allocated item array + // we need to make sure to copy the actual Item instead + // of just the pointers, as the visitor will nuke them + // upon ~ + for (int64_t i = nStart; i < nResultCount; ++i) + { + SpatialIndex::IData* result =results[i]; + (*items)[i - nStart] = (IndexItemH)dynamic_cast(result->clone()); + } + *nResults = nResultCount - nStart; +} diff --git a/support/spatialindex/src/capi/sidx_api.cc b/support/spatialindex/src/capi/sidx_api.cc index 2bb63788..b33ba3ff 100644 --- a/support/spatialindex/src/capi/sidx_api.cc +++ b/support/spatialindex/src/capi/sidx_api.cc @@ -6,7 +6,7 @@ * Copyright (c) 2009, Howard Butler * * 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 @@ -28,9 +28,34 @@ #include #include +#include +#include +#include #include +#ifdef __GNUC__ +# define LAST_ERROR_BUFFER_SIZE 1024 +/* + * __thread is gcc specific extension for thread-local storage, that does not allow complex + * constructor. We can't use any of std containers for storing mutliple error messages, but we + * could at least get latest error message safely. The error count will be at most 1. The finer + * solution would be to use thread-local storage from C++11, but since this library is compiled + * with C++98 flag, this option is not available yet. + */ +static __thread struct +{ + int code; + char message[LAST_ERROR_BUFFER_SIZE]; + char method[LAST_ERROR_BUFFER_SIZE]; +} last_error = {0}; +#else static std::stack errors; +#endif + +#ifdef _WIN32 +# pragma warning(push) +# pragma warning(disable: 4127) // assignment operator could not be generated +#endif #define VALIDATE_POINTER0(ptr, func) \ do { if( NULL == ptr ) { \ @@ -55,171 +80,447 @@ static std::stack errors; IDX_C_START SIDX_C_DLL void Error_Reset(void) { +#ifdef __GNUC__ + last_error.code = 0; +#else if (errors.empty()) return; for (std::size_t i=0;i(errors.size()); +#endif } SIDX_C_DLL IndexH Index_Create(IndexPropertyH hProp) { - VALIDATE_POINTER1(hProp, "Index_Create", NULL); - Tools::PropertySet* prop = static_cast(hProp); - - try { - return (IndexH) new Index(*prop); + VALIDATE_POINTER1(hProp, "Index_Create", NULL); + Tools::PropertySet* prop = reinterpret_cast(hProp); + + try { + return (IndexH) new Index(*prop); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_Create"); return NULL; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_Create"); return NULL; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_Create"); - return NULL; + return NULL; } return NULL; } SIDX_C_DLL IndexH Index_CreateWithStream( IndexPropertyH hProp, - int (*readNext)(SpatialIndex::id_type *id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, uint32_t *nDataLength) + int (*readNext)(SpatialIndex::id_type *id, double **pMin, double **pMax, uint32_t *nDimension, const uint8_t **pData, size_t *nDataLength) ) { - VALIDATE_POINTER1(hProp, "Index_CreateWithStream", NULL); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "Index_CreateWithStream", NULL); + Tools::PropertySet* prop = reinterpret_cast(hProp); - - try { - return (IndexH) new Index(*prop, readNext); + + try { + return (IndexH) new Index(*prop, readNext); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_CreateWithStream"); return NULL; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_CreateWithStream"); return NULL; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_CreateWithStream"); - return NULL; + return NULL; } return NULL; } SIDX_C_DLL void Index_Destroy(IndexH index) { - VALIDATE_POINTER0(index, "Index_Destroy"); + VALIDATE_POINTER0(index, "Index_Destroy"); Index* idx = (Index*) index; if (idx) delete idx; } -SIDX_C_DLL RTError Index_DeleteData( IndexH index, - int64_t id, - double* pdMin, - double* pdMax, +SIDX_C_DLL void Index_Flush(IndexH index) +{ + VALIDATE_POINTER0(index, "Index_Flush"); + Index* idx = (Index*) index; + if (idx) + { + idx->flush(); + } +} + +SIDX_C_DLL RTError Index_DeleteTPData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension + ) +{ + VALIDATE_POINTER1(index, "Index_DeleteTPData", RT_Failure); + + Index* idx = reinterpret_cast(index); + + try { + idx->index().deleteData(SpatialIndex::MovingRegion(pdMin, pdMax, pdVMin, pdVMax, tStart, tEnd, nDimension), id); + return RT_None; + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_DeleteTPData"); + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_DeleteTPData"); + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_DeleteTPData"); + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_DeleteMVRData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension + ) +{ + VALIDATE_POINTER1(index, "Index_DeleteMVRData", RT_Failure); + + Index* idx = reinterpret_cast(index); + + try { + idx->index().deleteData(SpatialIndex::TimeRegion(pdMin, pdMax, tStart, tEnd, nDimension), id); + return RT_None; + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_DeleteMVRData"); + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_DeleteMVRData"); + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_DeleteMVRData"); + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_DeleteData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, uint32_t nDimension) { - VALIDATE_POINTER1(index, "Index_DeleteData", RT_Failure); + VALIDATE_POINTER1(index, "Index_DeleteData", RT_Failure); - Index* idx = static_cast(index); + Index* idx = reinterpret_cast(index); - try { + try { idx->index().deleteData(SpatialIndex::Region(pdMin, pdMax, nDimension), id); return RT_None; } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_DeleteData"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_DeleteData"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_DeleteData"); - return RT_Failure; + return RT_Failure; } return RT_None; } -SIDX_C_DLL RTError Index_InsertData( IndexH index, - int64_t id, - double* pdMin, - double* pdMax, +SIDX_C_DLL RTError Index_InsertTPData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + const uint8_t* pData, + size_t nDataLength + ) +{ + VALIDATE_POINTER1(index, "Index_InsertTPData", RT_Failure); + + Index* idx = reinterpret_cast(index); + + // Test the data and check for the case when mins equal maxs (x,y,z,v) + // In that case, we will insert a SpatialIndex::MovingPoint + // instead of a SpatialIndex::MovingRegion + + bool isPoint = false; + SpatialIndex::IShape* shape = 0; + double const epsilon = std::numeric_limits::epsilon(); + + double length(0), vlength(0); + for (uint32_t i = 0; i < nDimension; ++i) { + double delta = pdMin[i] - pdMax[i]; + length += std::fabs(delta); + + double vDelta = pdVMin[i] - pdVMax[i]; + vlength += std::fabs(vDelta); + } + + if ((length <= epsilon) && (vlength <= epsilon)){ + isPoint = true; + } + + if (isPoint == true) { + shape = new SpatialIndex::MovingPoint(pdMin, pdVMin, tStart, tEnd, nDimension); + } else { + shape = new SpatialIndex::MovingRegion(pdMin, pdMax, pdVMin, pdVMax, tStart, tEnd, nDimension); + } + try { + idx->index().insertData(nDataLength, + pData, + *shape, + id); + + delete shape; + return RT_None; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_InsertTPData"); + delete shape; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_InsertTPData"); + delete shape; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_InsertTPData"); + delete shape; + return RT_Failure; + } + return RT_None; + +} + +SIDX_C_DLL RTError Index_InsertMVRData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + const uint8_t* pData, + size_t nDataLength + ) +{ + VALIDATE_POINTER1(index, "Index_InsertMVRData", RT_Failure); + + Index* idx = reinterpret_cast(index); + + // Test the data and check for the case when mins equal maxs + // In that case, we will insert a SpatialIndex::TimePoint + // instead of a SpatialIndex::timeRegion + + bool isPoint = false; + SpatialIndex::IShape* shape = 0; + double const epsilon = std::numeric_limits::epsilon(); + + double length(0); + for (uint32_t i = 0; i < nDimension; ++i) { + double delta = pdMin[i] - pdMax[i]; + length += std::fabs(delta); + } + + if (length <= epsilon){ + isPoint = true; + } + + if (isPoint == true) { + shape = new SpatialIndex::TimePoint(pdMin, tStart, tEnd, nDimension); + } else { + shape = new SpatialIndex::TimeRegion(pdMin, pdMax, tStart, tEnd, nDimension); + } + try { + idx->index().insertData(nDataLength, + pData, + *shape, + id); + + delete shape; + return RT_None; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_InsertMVRData"); + delete shape; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_InsertMVRData"); + delete shape; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_InsertMVRData"); + delete shape; + return RT_Failure; + } + return RT_None; +} + + +SIDX_C_DLL RTError Index_InsertData( IndexH index, + int64_t id, + double* pdMin, + double* pdMax, uint32_t nDimension, - const uint8_t* pData, - uint32_t nDataLength) + const uint8_t* pData, + size_t nDataLength) { - VALIDATE_POINTER1(index, "Index_InsertData", RT_Failure); + VALIDATE_POINTER1(index, "Index_InsertData", RT_Failure); + + Index* idx = reinterpret_cast(index); - Index* idx = static_cast(index); - // Test the data and check for the case when minx == maxx, miny == maxy - // and minz == maxz. In that case, we will insert a SpatialIndex::Point + // and minz == maxz. In that case, we will insert a SpatialIndex::Point // instead of a SpatialIndex::Region - + bool isPoint = false; SpatialIndex::IShape* shape = 0; - double const epsilon = std::numeric_limits::epsilon(); - + double const epsilon = std::numeric_limits::epsilon(); + double length(0); for (uint32_t i = 0; i < nDimension; ++i) { double delta = pdMin[i] - pdMax[i]; @@ -236,9 +537,9 @@ SIDX_C_DLL RTError Index_InsertData( IndexH index, shape = new SpatialIndex::Region(pdMin, pdMax, nDimension); } try { - idx->index().insertData(nDataLength, - pData, - *shape, + idx->index().insertData(nDataLength, + pData, + *shape, id); delete shape; @@ -246,155 +547,444 @@ SIDX_C_DLL RTError Index_InsertData( IndexH index, } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_InsertData"); delete shape; return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_InsertData"); delete shape; return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_InsertData"); delete shape; - return RT_Failure; + return RT_Failure; } return RT_None; } -SIDX_C_DLL RTError Index_Intersects_obj( IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - IndexItemH** items, +SIDX_C_DLL RTError Index_TPIntersects_obj( IndexH index, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + IndexItemH** items, + uint64_t* nResults) +{ + VALIDATE_POINTER1(index, "Index_TPIntersects_obj", RT_Failure); + Index* idx = reinterpret_cast(index); + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); + + ObjVisitor* visitor = new ObjVisitor; + try { + SpatialIndex::MovingRegion* r = new SpatialIndex::MovingRegion(pdMin, pdMax, pdVMin, pdVMax, tStart, tEnd, nDimension); + idx->index().intersectsWithQuery( *r, + *visitor); + + Page_ResultSet_Obj(*visitor, items, nStart, nResultLimit, nResults); + + delete r; + delete visitor; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_TPIntersects_obj"); + delete visitor; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_TPIntersects_obj"); + delete visitor; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_TPIntersects_obj"); + delete visitor; + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_MVRIntersects_obj( IndexH index, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + IndexItemH** items, + uint64_t* nResults) +{ + VALIDATE_POINTER1(index, "Index_MVRIntersects_obj", RT_Failure); + Index* idx = reinterpret_cast(index); + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); + + ObjVisitor* visitor = new ObjVisitor; + try { + SpatialIndex::TimeRegion* r = new SpatialIndex::TimeRegion(pdMin, pdMax, tStart, tEnd, nDimension); + idx->index().intersectsWithQuery( *r, + *visitor); + + Page_ResultSet_Obj(*visitor, items, nStart, nResultLimit, nResults); + + delete r; + delete visitor; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_MVRIntersects_obj"); + delete visitor; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_TPIntersects_obj"); + delete visitor; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_TPIntersects_obj"); + delete visitor; + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_Intersects_obj( IndexH index, + double* pdMin, + double* pdMax, + uint32_t nDimension, + IndexItemH** items, uint64_t* nResults) { - VALIDATE_POINTER1(index, "Index_Intersects_obj", RT_Failure); - Index* idx = static_cast(index); + VALIDATE_POINTER1(index, "Index_Intersects_obj", RT_Failure); + Index* idx = reinterpret_cast(index); + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); ObjVisitor* visitor = new ObjVisitor; - try { - SpatialIndex::Region* r = new SpatialIndex::Region(pdMin, pdMax, nDimension); - idx->index().intersectsWithQuery( *r, + try { + SpatialIndex::Region* r = new SpatialIndex::Region(pdMin, pdMax, nDimension); + idx->index().intersectsWithQuery( *r, *visitor); - *items = (SpatialIndex::IData**) malloc (visitor->GetResultCount() * sizeof(SpatialIndex::IData*)); - - std::vector& results = visitor->GetResults(); + Page_ResultSet_Obj(*visitor, items, nStart, nResultLimit, nResults); - // copy the Items into the newly allocated item array - // we need to make sure to copy the actual Item instead - // of just the pointers, as the visitor will nuke them - // upon ~ - for (uint32_t i=0; i < visitor->GetResultCount(); ++i) - { - SpatialIndex::IData* result =results[i]; - (*items)[i] = dynamic_cast(result->clone()); - - } - *nResults = visitor->GetResultCount(); - - delete r; + delete r; delete visitor; } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_Intersects_obj"); delete visitor; return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_Intersects_obj"); delete visitor; return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_Intersects_obj"); delete visitor; - return RT_Failure; + return RT_Failure; } return RT_None; } -SIDX_C_DLL RTError Index_Intersects_id( IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - int64_t** ids, +SIDX_C_DLL RTError Index_TPIntersects_id( IndexH index, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + int64_t** ids, + uint64_t* nResults) +{ + VALIDATE_POINTER1(index, "Index_TPIntersects_id", RT_Failure); + Index* idx = reinterpret_cast(index); + + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); + + IdVisitor* visitor = new IdVisitor; + try { + SpatialIndex::MovingRegion* r = new SpatialIndex::MovingRegion(pdMin, pdMax, pdVMin, pdVMax, tStart, tEnd, nDimension); + idx->index().intersectsWithQuery( *r, + *visitor); + + Page_ResultSet_Ids(*visitor, ids, nStart, nResultLimit, nResults); + + delete r; + delete visitor; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_TPIntersects_id"); + delete visitor; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_TPIntersects_id"); + delete visitor; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_TPIntersects_id"); + delete visitor; + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_MVRIntersects_id( IndexH index, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + int64_t** ids, + uint64_t* nResults) +{ + VALIDATE_POINTER1(index, "Index_MVRIntersects_id", RT_Failure); + Index* idx = reinterpret_cast(index); + + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); + + IdVisitor* visitor = new IdVisitor; + try { + SpatialIndex::TimeRegion* r = new SpatialIndex::TimeRegion(pdMin, pdMax, tStart, tEnd, nDimension); + idx->index().intersectsWithQuery( *r, + *visitor); + + Page_ResultSet_Ids(*visitor, ids, nStart, nResultLimit, nResults); + + delete r; + delete visitor; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_MVRIntersects_id"); + delete visitor; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_MVRIntersects_id"); + delete visitor; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_MVRIntersects_id"); + delete visitor; + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_Intersects_id( IndexH index, + double* pdMin, + double* pdMax, + uint32_t nDimension, + int64_t** ids, uint64_t* nResults) { - VALIDATE_POINTER1(index, "Index_Intersects_id", RT_Failure); - Index* idx = static_cast(index); + VALIDATE_POINTER1(index, "Index_Intersects_id", RT_Failure); + Index* idx = reinterpret_cast(index); + + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); IdVisitor* visitor = new IdVisitor; try { - SpatialIndex::Region* r = new SpatialIndex::Region(pdMin, pdMax, nDimension); - idx->index().intersectsWithQuery( *r, + SpatialIndex::Region* r = new SpatialIndex::Region(pdMin, pdMax, nDimension); + idx->index().intersectsWithQuery( *r, *visitor); - *nResults = visitor->GetResultCount(); - - *ids = (int64_t*) malloc (*nResults * sizeof(int64_t)); - - std::vector& results = visitor->GetResults(); - - for (uint32_t i=0; i < *nResults; ++i) - { - (*ids)[i] = results[i]; + Page_ResultSet_Ids(*visitor, ids, nStart, nResultLimit, nResults); - } - - delete r; + delete r; delete visitor; } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_Intersects_id"); delete visitor; return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_Intersects_id"); delete visitor; return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_Intersects_id"); delete visitor; - return RT_Failure; + return RT_Failure; } return RT_None; } -SIDX_C_DLL RTError Index_Intersects_count( IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, +SIDX_C_DLL RTError Index_TPIntersects_count( IndexH index, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + uint64_t* nResults) +{ + VALIDATE_POINTER1(index, "Index_TPIntersects_count", RT_Failure); + Index* idx = reinterpret_cast(index); + + CountVisitor* visitor = new CountVisitor; + try { + SpatialIndex::MovingRegion* r = new SpatialIndex::MovingRegion(pdMin, pdMax, pdVMin, pdVMax, tStart, tEnd, nDimension); + idx->index().intersectsWithQuery( *r, + *visitor); + + *nResults = visitor->GetResultCount(); + + delete r; + delete visitor; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_TPIntersects_count"); + delete visitor; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_TPIntersects_count"); + delete visitor; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_TPIntersects_count"); + delete visitor; + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_MVRIntersects_count( IndexH index, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + uint64_t* nResults) +{ + VALIDATE_POINTER1(index, "Index_MVRIntersects_count", RT_Failure); + Index* idx = reinterpret_cast(index); + + CountVisitor* visitor = new CountVisitor; + try { + SpatialIndex::TimeRegion* r = new SpatialIndex::TimeRegion(pdMin, pdMax, tStart, tEnd, nDimension); + idx->index().intersectsWithQuery( *r, + *visitor); + + *nResults = visitor->GetResultCount(); + + delete r; + delete visitor; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_MVRIntersects_count"); + delete visitor; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_MVRIntersects_count"); + delete visitor; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_MVRIntersects_count"); + delete visitor; + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_Intersects_count( IndexH index, + double* pdMin, + double* pdMax, + uint32_t nDimension, uint64_t* nResults) { - VALIDATE_POINTER1(index, "Index_Intersects_count", RT_Failure); - Index* idx = static_cast(index); + VALIDATE_POINTER1(index, "Index_Intersects_count", RT_Failure); + Index* idx = reinterpret_cast(index); CountVisitor* visitor = new CountVisitor; try { - SpatialIndex::Region* r = new SpatialIndex::Region(pdMin, pdMax, nDimension); - idx->index().intersectsWithQuery( *r, + SpatialIndex::Region* r = new SpatialIndex::Region(pdMin, pdMax, nDimension); + idx->index().intersectsWithQuery( *r, *visitor); *nResults = visitor->GetResultCount(); @@ -404,155 +994,140 @@ SIDX_C_DLL RTError Index_Intersects_count( IndexH index, } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_Intersects_count"); delete visitor; return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_Intersects_count"); delete visitor; return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_Intersects_count"); delete visitor; - return RT_Failure; + return RT_Failure; } return RT_None; } -SIDX_C_DLL RTError Index_SegmentIntersects_obj( IndexH index, - double* pdStartPoint, - double* pdEndPoint, - uint32_t nDimension, - IndexItemH** items, +SIDX_C_DLL RTError Index_SegmentIntersects_obj( IndexH index, + double* pdStartPoint, + double* pdEndPoint, + uint32_t nDimension, + IndexItemH** items, uint64_t* nResults) { - VALIDATE_POINTER1(index, "Index_Intersects_obj", RT_Failure); - Index* idx = static_cast(index); + VALIDATE_POINTER1(index, "Index_Intersects_obj", RT_Failure); + Index* idx = reinterpret_cast(index); + + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); ObjVisitor* visitor = new ObjVisitor; - try { - SpatialIndex::LineSegment* l = new SpatialIndex::LineSegment(pdStartPoint, pdEndPoint, nDimension); - idx->index().intersectsWithQuery( *l, + try { + SpatialIndex::LineSegment* l = new SpatialIndex::LineSegment(pdStartPoint, pdEndPoint, nDimension); + idx->index().intersectsWithQuery( *l, *visitor); - *items = (SpatialIndex::IData**) malloc (visitor->GetResultCount() * sizeof(SpatialIndex::IData*)); - - std::vector& results = visitor->GetResults(); - - // copy the Items into the newly allocated item array - // we need to make sure to copy the actual Item instead - // of just the pointers, as the visitor will nuke them - // upon ~ - for (uint32_t i=0; i < visitor->GetResultCount(); ++i) - { - SpatialIndex::IData* result =results[i]; - (*items)[i] = dynamic_cast(result->clone()); + Page_ResultSet_Obj(*visitor, items, nStart, nResultLimit, nResults); - } - *nResults = visitor->GetResultCount(); - - delete l; + delete l; delete visitor; } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_Intersects_obj"); delete visitor; return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_Intersects_obj"); delete visitor; return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_Intersects_obj"); delete visitor; - return RT_Failure; + return RT_Failure; } return RT_None; } -SIDX_C_DLL RTError Index_SegmentIntersects_id( IndexH index, - double* pdStartPoint, - double* pdEndPoint, - uint32_t nDimension, - int64_t** ids, +SIDX_C_DLL RTError Index_SegmentIntersects_id( IndexH index, + double* pdStartPoint, + double* pdEndPoint, + uint32_t nDimension, + int64_t** ids, uint64_t* nResults) { - VALIDATE_POINTER1(index, "Index_Intersects_id", RT_Failure); - Index* idx = static_cast(index); + VALIDATE_POINTER1(index, "Index_Intersects_id", RT_Failure); + Index* idx = reinterpret_cast(index); + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); IdVisitor* visitor = new IdVisitor; try { - SpatialIndex::LineSegment* l = new SpatialIndex::LineSegment(pdStartPoint, pdEndPoint, nDimension); - idx->index().intersectsWithQuery( *l, + SpatialIndex::LineSegment* l = new SpatialIndex::LineSegment(pdStartPoint, pdEndPoint, nDimension); + idx->index().intersectsWithQuery( *l, *visitor); - *nResults = visitor->GetResultCount(); - - *ids = (int64_t*) malloc (*nResults * sizeof(int64_t)); - - std::vector& results = visitor->GetResults(); - - for (uint32_t i=0; i < *nResults; ++i) - { - (*ids)[i] = results[i]; - - } + Page_ResultSet_Ids(*visitor, ids, nStart, nResultLimit, nResults); - delete l; + delete l; delete visitor; } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_Intersects_id"); delete visitor; return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_Intersects_id"); delete visitor; return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_Intersects_id"); delete visitor; - return RT_Failure; + return RT_Failure; } return RT_None; } -SIDX_C_DLL RTError Index_SegmentIntersects_count( IndexH index, - double* pdStartPoint, - double* pdEndPoint, - uint32_t nDimension, +SIDX_C_DLL RTError Index_SegmentIntersects_count( IndexH index, + double* pdStartPoint, + double* pdEndPoint, + uint32_t nDimension, uint64_t* nResults) { - VALIDATE_POINTER1(index, "Index_Intersects_count", RT_Failure); - Index* idx = static_cast(index); + VALIDATE_POINTER1(index, "Index_Intersects_count", RT_Failure); + Index* idx = reinterpret_cast(index); CountVisitor* visitor = new CountVisitor; try { SpatialIndex::LineSegment* l = new SpatialIndex::LineSegment(pdStartPoint, pdEndPoint, nDimension); - idx->index().intersectsWithQuery( *l, + idx->index().intersectsWithQuery( *l, *visitor); *nResults = visitor->GetResultCount(); @@ -562,220 +1137,478 @@ SIDX_C_DLL RTError Index_SegmentIntersects_count( IndexH index, } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_Intersects_count"); delete visitor; return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_Intersects_count"); delete visitor; return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_Intersects_count"); delete visitor; - return RT_Failure; + return RT_Failure; } return RT_None; } -SIDX_C_DLL RTError Index_NearestNeighbors_id(IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - int64_t** ids, +SIDX_C_DLL RTError Index_TPNearestNeighbors_id(IndexH index, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + int64_t** ids, + uint64_t* nResults) +{ + VALIDATE_POINTER1(index, "Index_TPNearestNeighbors_id", RT_Failure); + Index* idx = reinterpret_cast(index); + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); + + IdVisitor* visitor = new IdVisitor; + + try { + SpatialIndex::MovingRegion* r = new SpatialIndex::MovingRegion(pdMin, pdMax, pdVMin, pdVMax, tStart, tEnd, nDimension); + idx->index().nearestNeighborQuery( static_cast(*nResults), + *r, + *visitor); + + Page_ResultSet_Ids(*visitor, ids, nStart, nResultLimit, nResults); + + delete r; + delete visitor; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_TPNearestNeighbors_id"); + delete visitor; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_TPNearestNeighbors_id"); + delete visitor; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_TPNearestNeighbors_id"); + delete visitor; + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_MVRNearestNeighbors_id(IndexH index, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + int64_t** ids, + uint64_t* nResults) +{ + VALIDATE_POINTER1(index, "Index_MVRNearestNeighbors_id", RT_Failure); + Index* idx = reinterpret_cast(index); + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); + + IdVisitor* visitor = new IdVisitor; + + try { + SpatialIndex::TimeRegion* r = new SpatialIndex::TimeRegion(pdMin, pdMax, tStart, tEnd, nDimension); + idx->index().nearestNeighborQuery( *nResults, + *r, + *visitor); + + Page_ResultSet_Ids(*visitor, ids, nStart, nResultLimit, nResults); + + delete r; + delete visitor; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_MVRNearestNeighbors_id"); + delete visitor; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_MVRNearestNeighbors_id"); + delete visitor; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_MVRNearestNeighbors_id"); + delete visitor; + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_NearestNeighbors_id(IndexH index, + double* pdMin, + double* pdMax, + uint32_t nDimension, + int64_t** ids, uint64_t* nResults) { - VALIDATE_POINTER1(index, "Index_NearestNeighbors_id", RT_Failure); - Index* idx = static_cast(index); + VALIDATE_POINTER1(index, "Index_NearestNeighbors_id", RT_Failure); + Index* idx = reinterpret_cast(index); + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); IdVisitor* visitor = new IdVisitor; - try { - idx->index().nearestNeighborQuery( *nResults, - SpatialIndex::Region(pdMin, pdMax, nDimension), + try { + SpatialIndex::Region* r = new SpatialIndex::Region(pdMin, pdMax, nDimension); + + idx->index().nearestNeighborQuery( static_cast(*nResults), + *r, *visitor); - - *ids = (int64_t*) malloc (visitor->GetResultCount() * sizeof(int64_t)); - - std::vector& results = visitor->GetResults(); - - *nResults = results.size(); - - for (uint32_t i=0; i < *nResults; ++i) - { - (*ids)[i] = results[i]; - } + Page_ResultSet_Ids(*visitor, ids, nStart, nResultLimit, nResults); - + delete r; delete visitor; - + } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_NearestNeighbors_id"); delete visitor; return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_NearestNeighbors_id"); delete visitor; return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_NearestNeighbors_id"); delete visitor; - return RT_Failure; + return RT_Failure; } return RT_None; } -SIDX_C_DLL RTError Index_NearestNeighbors_obj(IndexH index, - double* pdMin, - double* pdMax, - uint32_t nDimension, - IndexItemH** items, - int64_t* nResults) +SIDX_C_DLL RTError Index_TPNearestNeighbors_obj(IndexH index, + double* pdMin, + double* pdMax, + double* pdVMin, + double* pdVMax, + double tStart, + double tEnd, + uint32_t nDimension, + IndexItemH** items, + uint64_t* nResults) +{ + VALIDATE_POINTER1(index, "Index_TPNearestNeighbors_obj", RT_Failure); + Index* idx = reinterpret_cast(index); + + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); + + ObjVisitor* visitor = new ObjVisitor; + try { + SpatialIndex::MovingRegion* r = new SpatialIndex::MovingRegion(pdMin, pdMax, pdVMin, pdVMax, tStart, tEnd, nDimension); + + idx->index().nearestNeighborQuery( static_cast(*nResults), + *r, + *visitor); + + Page_ResultSet_Obj(*visitor, items, nStart, nResultLimit, nResults); + + delete r; + delete visitor; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_TPNearestNeighbors_obj"); + delete visitor; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_TPNearestNeighbors_obj"); + delete visitor; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_NearestNeighbors_obj"); + delete visitor; + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_MVRNearestNeighbors_obj(IndexH index, + double* pdMin, + double* pdMax, + double tStart, + double tEnd, + uint32_t nDimension, + IndexItemH** items, + uint64_t* nResults) +{ + VALIDATE_POINTER1(index, "Index_MVRNearestNeighbors_obj", RT_Failure); + Index* idx = reinterpret_cast(index); + + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); + + ObjVisitor* visitor = new ObjVisitor; + try { + SpatialIndex::TimeRegion* r = new SpatialIndex::TimeRegion(pdMin, pdMax, tStart, tEnd, nDimension); + + idx->index().nearestNeighborQuery( *nResults, + *r, + *visitor); + + Page_ResultSet_Obj(*visitor, items, nStart, nResultLimit, nResults); + + delete r; + delete visitor; + + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "Index_MVRNearestNeighbors_obj"); + delete visitor; + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "Index_MVRNearestNeighbors_obj"); + delete visitor; + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_NearestNeighbors_obj"); + delete visitor; + return RT_Failure; + } + return RT_None; +} + +SIDX_C_DLL RTError Index_NearestNeighbors_obj(IndexH index, + double* pdMin, + double* pdMax, + uint32_t nDimension, + IndexItemH** items, + uint64_t* nResults) { - VALIDATE_POINTER1(index, "Index_NearestNeighbors_obj", RT_Failure); - Index* idx = static_cast(index); + VALIDATE_POINTER1(index, "Index_NearestNeighbors_obj", RT_Failure); + Index* idx = reinterpret_cast(index); + + int64_t nResultLimit, nStart; + + nResultLimit = idx->GetResultSetLimit(); + nStart = idx->GetResultSetOffset(); ObjVisitor* visitor = new ObjVisitor; - try { - idx->index().nearestNeighborQuery( *nResults, - SpatialIndex::Region(pdMin, pdMax, nDimension), + try { + SpatialIndex::Region* r = new SpatialIndex::Region(pdMin, pdMax, nDimension); + + idx->index().nearestNeighborQuery( static_cast(*nResults), + *r, *visitor); - - *items = (SpatialIndex::IData**) malloc (visitor->GetResultCount() * sizeof(Item*)); - - std::vector results = visitor->GetResults(); - *nResults = results.size(); - - // copy the Items into the newly allocated item array - // we need to make sure to copy the actual Item instead - // of just the pointers, as the visitor will nuke them - // upon ~ - for (uint32_t i=0; i < visitor->GetResultCount(); ++i) - { - SpatialIndex::IData* result = results[i]; - (*items)[i] = dynamic_cast(result->clone()); + Page_ResultSet_Obj(*visitor, items, nStart, nResultLimit, nResults); - } - + delete r; delete visitor; } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_NearestNeighbors_obj"); delete visitor; return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_NearestNeighbors_obj"); delete visitor; return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_NearestNeighbors_obj"); delete visitor; - return RT_Failure; + return RT_Failure; } return RT_None; } -SIDX_C_DLL RTError Index_GetBounds( IndexH index, - double** ppdMin, - double** ppdMax, +SIDX_C_DLL RTError Index_GetBounds( IndexH index, + double** ppdMin, + double** ppdMax, uint32_t* nDimension) { VALIDATE_POINTER1(index, "Index_GetBounds", RT_Failure); - Index* idx = static_cast(index); + Index* idx = reinterpret_cast(index); BoundsQuery* query = new BoundsQuery; - try { + try { idx->index().queryStrategy( *query); - + const SpatialIndex::Region* bounds = query->GetBounds(); - if (bounds == 0) { + if (bounds == 0) { *nDimension = 0; delete query; return RT_None; } - + *nDimension =bounds->getDimension(); - + *ppdMin = (double*) malloc (*nDimension * sizeof(double)); *ppdMax = (double*) malloc (*nDimension * sizeof(double)); - + for (uint32_t i=0; i< *nDimension; ++i) { (*ppdMin)[i] = bounds->getLow(i); (*ppdMax)[i] = bounds->getHigh(i); } - + delete query; } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_GetBounds"); delete query; return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_GetBounds"); delete query; return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_GetBounds"); delete query; - return RT_Failure; + return RT_Failure; } return RT_None; } +SIDX_DLL RTError Index_SetResultSetOffset(IndexH index, int64_t value) +{ + try + { + VALIDATE_POINTER1(index, "Index_SetResultSetOffset", RT_Failure); + Index* idx = reinterpret_cast(index); + idx->SetResultSetOffset(value); + } + catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_SetResultSetOffset"); + return RT_Failure; + } + return RT_None; +} + +SIDX_DLL int64_t Index_GetResultSetOffset(IndexH index) +{ + VALIDATE_POINTER1(index, "Index_GetResultSetOffset", 0); + Index* idx = reinterpret_cast(index); + return idx->GetResultSetOffset(); +} + +SIDX_DLL RTError Index_SetResultSetLimit(IndexH index, int64_t value) +{ + try + { + VALIDATE_POINTER1(index, "Index_SetResultSetLimit", RT_Failure); + Index* idx = reinterpret_cast(index); + idx->SetResultSetLimit(value); + } + catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "Index_SetResultSetLimit"); + return RT_Failure; + } + return RT_None; +} + +SIDX_DLL int64_t Index_GetResultSetLimit(IndexH index) +{ + VALIDATE_POINTER1(index, "Index_GetResultSetLimit", 0); + Index* idx = reinterpret_cast(index); + return idx->GetResultSetLimit(); +} + SIDX_C_DLL uint32_t Index_IsValid(IndexH index) { - VALIDATE_POINTER1(index, "Index_IsValid", 0); - Index* idx = static_cast(index); - return static_cast(idx->index().isIndexValid()); + VALIDATE_POINTER1(index, "Index_IsValid", 0); + Index* idx = reinterpret_cast(index); + return static_cast(idx->index().isIndexValid()); } SIDX_C_DLL IndexPropertyH Index_GetProperties(IndexH index) { - VALIDATE_POINTER1(index, "Index_GetProperties", 0); - Index* idx = static_cast(index); + VALIDATE_POINTER1(index, "Index_GetProperties", 0); + Index* idx = reinterpret_cast(index); Tools::PropertySet* ps = new Tools::PropertySet; - - idx->index().getIndexProperties(*ps); + *ps = idx->GetProperties(); + + Tools::PropertySet base_props; + idx->index().getIndexProperties(base_props); + ps->setProperty("IndexIdentifier", base_props.getProperty("IndexIdentifier")); return (IndexPropertyH)ps; } SIDX_C_DLL void Index_ClearBuffer(IndexH index) { - VALIDATE_POINTER0(index, "Index_ClearBuffer"); - Index* idx = static_cast(index); + VALIDATE_POINTER0(index, "Index_ClearBuffer"); + Index* idx = reinterpret_cast(index); idx->buffer().clear(); } @@ -785,12 +1618,12 @@ SIDX_C_DLL void Index_DestroyObjResults(IndexItemH* results, uint32_t nResults) SpatialIndex::IData* it; for (uint32_t i=0; i< nResults; ++i) { if (results[i] != NULL) { - it = static_cast(results[i]); - if (it != 0) + it = reinterpret_cast(results[i]); + if (it != 0) delete it; } } - + std::free(results); } @@ -802,18 +1635,18 @@ SIDX_C_DLL void Index_Free(void* results) std::free(results); } -SIDX_C_DLL RTError Index_GetLeaves( IndexH index, +SIDX_C_DLL RTError Index_GetLeaves( IndexH index, uint32_t* nNumLeafNodes, - uint32_t** nLeafSizes, - int64_t** nLeafIDs, + uint32_t** nLeafSizes, + int64_t** nLeafIDs, int64_t*** nLeafChildIDs, - double*** pppdMin, - double*** pppdMax, + double*** pppdMin, + double*** pppdMax, uint32_t* nDimension) { VALIDATE_POINTER1(index, "Index_GetLeaves", RT_Failure); - Index* idx = static_cast(index); - + Index* idx = reinterpret_cast(index); + std::vector::const_iterator i; LeafQuery* query = new LeafQuery; @@ -827,41 +1660,41 @@ SIDX_C_DLL RTError Index_GetLeaves( IndexH index, if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property Dimension must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property Dimension must be Tools::VT_ULONG", "Index_GetLeaves"); return RT_Failure; } } - + *nDimension = var.m_val.ulVal; - - try { + + try { idx->index().queryStrategy( *query); - + const std::vector& results = query->GetResults(); - *nNumLeafNodes = results.size(); - + *nNumLeafNodes = (uint32_t)results.size(); + *nLeafSizes = (uint32_t*) malloc (*nNumLeafNodes * sizeof(uint32_t)); *nLeafIDs = (int64_t*) malloc (*nNumLeafNodes * sizeof(int64_t)); *nLeafChildIDs = (int64_t**) malloc(*nNumLeafNodes * sizeof(int64_t*)); *pppdMin = (double**) malloc (*nNumLeafNodes * sizeof(double*)); *pppdMax = (double**) malloc (*nNumLeafNodes * sizeof(double*)); - + uint32_t k=0; for (i = results.begin(); i != results.end(); ++i) { std::vector const& ids = (*i).GetIDs(); const SpatialIndex::Region* b = (*i).GetBounds(); - + (*nLeafIDs)[k] = (*i).getIdentifier(); - (*nLeafSizes)[k] = ids.size(); + (*nLeafSizes)[k] = (uint32_t)ids.size(); (*nLeafChildIDs)[k] = (int64_t*) malloc( (*nLeafSizes)[k] * sizeof(int64_t)); - (*pppdMin)[k] = (double*) malloc ( (*nLeafSizes)[k] * sizeof(double)); - (*pppdMax)[k] = (double*) malloc ( (*nLeafSizes)[k] * sizeof(double)); + (*pppdMin)[k] = (double*) malloc (*nDimension * sizeof(double)); + (*pppdMax)[k] = (double*) malloc (*nDimension * sizeof(double)); for (uint32_t i=0; i< *nDimension; ++i) { (*pppdMin)[k][i] = b->getLow(i); (*pppdMax)[k][i] = b->getHigh(i); @@ -873,29 +1706,29 @@ SIDX_C_DLL RTError Index_GetLeaves( IndexH index, ++k; } - + delete query; } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "Index_GetLeaves"); delete query; return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "Index_GetLeaves"); delete query; return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "Index_GetLeaves"); delete query; - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -903,8 +1736,8 @@ SIDX_C_DLL RTError Index_GetLeaves( IndexH index, SIDX_C_DLL void IndexItem_Destroy(IndexItemH item) { - VALIDATE_POINTER0(item, "IndexItem_Destroy"); - SpatialIndex::IData* it = static_cast(item); + VALIDATE_POINTER0(item, "IndexItem_Destroy"); + SpatialIndex::IData* it = reinterpret_cast(item); if (it != 0) delete it; } @@ -912,8 +1745,8 @@ SIDX_C_DLL RTError IndexItem_GetData( IndexItemH item, uint8_t** data, uint64_t* length) { - VALIDATE_POINTER1(item, "IndexItem_GetData", RT_Failure); - SpatialIndex::IData* it = static_cast(item); + VALIDATE_POINTER1(item, "IndexItem_GetData", RT_Failure); + SpatialIndex::IData* it = reinterpret_cast(item); uint8_t* p_data; uint32_t* l= new uint32_t; @@ -925,49 +1758,49 @@ SIDX_C_DLL RTError IndexItem_GetData( IndexItemH item, delete[] p_data; delete l; return RT_None; - + } -SIDX_C_DLL int64_t IndexItem_GetID(IndexItemH item) +SIDX_C_DLL int64_t IndexItem_GetID(IndexItemH item) { - VALIDATE_POINTER1(item, "IndexItem_GetID",0); - SpatialIndex::IData* it = static_cast(item); + VALIDATE_POINTER1(item, "IndexItem_GetID",0); + SpatialIndex::IData* it = reinterpret_cast(item); int64_t value = it->getIdentifier(); return value; } -SIDX_C_DLL RTError IndexItem_GetBounds( IndexItemH item, - double** ppdMin, - double** ppdMax, +SIDX_C_DLL RTError IndexItem_GetBounds( IndexItemH item, + double** ppdMin, + double** ppdMax, uint32_t* nDimension) { VALIDATE_POINTER1(item, "IndexItem_GetBounds", RT_Failure); - SpatialIndex::IData* it = static_cast(item); - + SpatialIndex::IData* it = reinterpret_cast(item); + SpatialIndex::IShape* s; it->getShape(&s); - + SpatialIndex::Region *bounds = new SpatialIndex::Region(); s->getMBR(*bounds); - - if (bounds == 0) { + + if (bounds == 0) { *nDimension = 0; delete bounds; delete s; return RT_None; } *nDimension = bounds->getDimension(); - + *ppdMin = (double*) malloc (*nDimension * sizeof(double)); *ppdMax = (double*) malloc (*nDimension * sizeof(double)); - + if (ppdMin == NULL || ppdMax == NULL) { - Error_PushError(RT_Failure, - "Unable to allocation bounds array(s)", + Error_PushError(RT_Failure, + "Unable to allocation bounds array(s)", "IndexItem_GetBounds"); - return RT_Failure; + return RT_Failure; } - + for (uint32_t i=0; i< *nDimension; ++i) { (*ppdMin)[i] = bounds->getLow(i); (*ppdMax)[i] = bounds->getHigh(i); @@ -985,16 +1818,16 @@ SIDX_C_DLL IndexPropertyH IndexProperty_Create() SIDX_C_DLL void IndexProperty_Destroy(IndexPropertyH hProp) { - VALIDATE_POINTER0(hProp, "IndexProperty_Destroy"); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER0(hProp, "IndexProperty_Destroy"); + Tools::PropertySet* prop = reinterpret_cast(hProp); if (prop != 0) delete prop; } -SIDX_C_DLL RTError IndexProperty_SetIndexType(IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetIndexType(IndexPropertyH hProp, RTIndexType value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexType", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexType", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1009,21 +1842,21 @@ SIDX_C_DLL RTError IndexProperty_SetIndexType(IndexPropertyH hProp, } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetIndexType"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetIndexType"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetIndexType"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1031,7 +1864,7 @@ SIDX_C_DLL RTError IndexProperty_SetIndexType(IndexPropertyH hProp, SIDX_C_DLL RTIndexType IndexProperty_GetIndexType(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetIndexType", RT_InvalidIndexType); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("IndexType"); @@ -1039,25 +1872,25 @@ SIDX_C_DLL RTIndexType IndexProperty_GetIndexType(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property IndexType must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property IndexType must be Tools::VT_ULONG", "IndexProperty_GetIndexType"); return RT_InvalidIndexType; } return (RTIndexType) var.m_val.ulVal; } - Error_PushError(RT_Failure, - "Property IndexType was empty", - "IndexProperty_GetIndexType"); + Error_PushError(RT_Failure, + "Property IndexType was empty", + "IndexProperty_GetIndexType"); return RT_InvalidIndexType; } SIDX_C_DLL RTError IndexProperty_SetDimension(IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetDimension", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetDimension", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1067,29 +1900,29 @@ SIDX_C_DLL RTError IndexProperty_SetDimension(IndexPropertyH hProp, uint32_t val prop->setProperty("Dimension", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetDimension"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetDimension"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetDimension"); - return RT_Failure; + return RT_Failure; } return RT_None; } SIDX_C_DLL uint32_t IndexProperty_GetDimension(IndexPropertyH hProp) { - VALIDATE_POINTER1(hProp, "IndexProperty_GetDimension", RT_InvalidIndexType); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_GetDimension", 0); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("Dimension"); @@ -1097,44 +1930,44 @@ SIDX_C_DLL uint32_t IndexProperty_GetDimension(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property IndexType must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property IndexType must be Tools::VT_ULONG", "IndexProperty_GetDimension"); return 0; } - + return var.m_val.ulVal; } - + // A zero dimension index is invalid. - Error_PushError(RT_Failure, - "Property Dimension was empty", + Error_PushError(RT_Failure, + "Property Dimension was empty", "IndexProperty_GetDimension"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetIndexVariant( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetIndexVariant( IndexPropertyH hProp, RTIndexVariant value) { using namespace SpatialIndex; - VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexVariant", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexVariant", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; - + try { if (!(value == RT_Linear || value == RT_Quadratic || value == RT_Star)) { throw std::runtime_error("Inputted value is not a valid index variant"); } - + var.m_varType = Tools::VT_LONG; RTIndexType type = IndexProperty_GetIndexType(hProp); if (type == RT_InvalidIndexType ) { - Error_PushError(RT_Failure, - "Index type is not properly set", + Error_PushError(RT_Failure, + "Index type is not properly set", "IndexProperty_SetIndexVariant"); return RT_Failure; } @@ -1143,70 +1976,70 @@ SIDX_C_DLL RTError IndexProperty_SetIndexVariant( IndexPropertyH hProp, prop->setProperty("TreeVariant", var); } else if (type == RT_MVRTree) { var.m_val.lVal = static_cast(value); - prop->setProperty("TreeVariant", var); + prop->setProperty("TreeVariant", var); } else if (type == RT_TPRTree) { var.m_val.lVal = static_cast(value); - prop->setProperty("TreeVariant", var); + prop->setProperty("TreeVariant", var); } - + } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetIndexVariant"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetIndexCapacity"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetIndexCapacity"); - return RT_Failure; + return RT_Failure; } return RT_None; } SIDX_C_DLL RTIndexVariant IndexProperty_GetIndexVariant(IndexPropertyH hProp) { - VALIDATE_POINTER1( hProp, - "IndexProperty_GetIndexVariant", + VALIDATE_POINTER1( hProp, + "IndexProperty_GetIndexVariant", RT_InvalidIndexVariant); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("TreeVariant"); - + if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_LONG) { - Error_PushError(RT_Failure, - "Property IndexVariant must be Tools::VT_LONG", + Error_PushError(RT_Failure, + "Property IndexVariant must be Tools::VT_LONG", "IndexProperty_GetIndexVariant"); return RT_InvalidIndexVariant; } - + return static_cast(var.m_val.lVal); } - + // if we didn't get anything, we're returning an error condition - Error_PushError(RT_Failure, - "Property IndexVariant was empty", + Error_PushError(RT_Failure, + "Property IndexVariant was empty", "IndexProperty_GetIndexVariant"); return RT_InvalidIndexVariant; } -SIDX_C_DLL RTError IndexProperty_SetIndexStorage( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetIndexStorage( IndexPropertyH hProp, RTStorageType value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexStorage", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexStorage", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1219,32 +2052,32 @@ SIDX_C_DLL RTError IndexProperty_SetIndexStorage( IndexPropertyH hProp, prop->setProperty("IndexStorageType", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetIndexStorage"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetIndexStorage"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetIndexStorage"); - return RT_Failure; + return RT_Failure; } return RT_None; } SIDX_C_DLL RTStorageType IndexProperty_GetIndexStorage(IndexPropertyH hProp) { - VALIDATE_POINTER1( hProp, - "IndexProperty_GetIndexStorage", + VALIDATE_POINTER1( hProp, + "IndexProperty_GetIndexStorage", RT_InvalidStorageType); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("IndexStorageType"); @@ -1252,28 +2085,28 @@ SIDX_C_DLL RTStorageType IndexProperty_GetIndexStorage(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property IndexStorage must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property IndexStorage must be Tools::VT_ULONG", "IndexProperty_GetIndexStorage"); return RT_InvalidStorageType; } - + return static_cast(var.m_val.ulVal); } - + // if we didn't get anything, we're returning an error condition - Error_PushError(RT_Failure, - "Property IndexStorage was empty", + Error_PushError(RT_Failure, + "Property IndexStorage was empty", "IndexProperty_GetIndexStorage"); return RT_InvalidStorageType; } -SIDX_C_DLL RTError IndexProperty_SetIndexCapacity(IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetIndexCapacity(IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexCapacity", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexCapacity", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1283,21 +2116,21 @@ SIDX_C_DLL RTError IndexProperty_SetIndexCapacity(IndexPropertyH hProp, prop->setProperty("IndexCapacity", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetIndexCapacity"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetIndexCapacity"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetIndexCapacity"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1305,7 +2138,7 @@ SIDX_C_DLL RTError IndexProperty_SetIndexCapacity(IndexPropertyH hProp, SIDX_C_DLL uint32_t IndexProperty_GetIndexCapacity(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetIndexCapacity", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("IndexCapacity"); @@ -1313,27 +2146,27 @@ SIDX_C_DLL uint32_t IndexProperty_GetIndexCapacity(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property IndexCapacity must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property IndexCapacity must be Tools::VT_ULONG", "IndexProperty_GetIndexCapacity"); return 0; } - + return var.m_val.ulVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property IndexCapacity was empty", + Error_PushError(RT_Failure, + "Property IndexCapacity was empty", "IndexProperty_GetIndexCapacity"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetLeafCapacity( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetLeafCapacity( IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetLeafCapacity", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetLeafCapacity", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1343,21 +2176,21 @@ SIDX_C_DLL RTError IndexProperty_SetLeafCapacity( IndexPropertyH hProp, prop->setProperty("LeafCapacity", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetLeafCapacity"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetLeafCapacity"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetLeafCapacity"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1365,7 +2198,7 @@ SIDX_C_DLL RTError IndexProperty_SetLeafCapacity( IndexPropertyH hProp, SIDX_C_DLL uint32_t IndexProperty_GetLeafCapacity(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetLeafCapacity", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("LeafCapacity"); @@ -1373,27 +2206,27 @@ SIDX_C_DLL uint32_t IndexProperty_GetLeafCapacity(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property LeafCapacity must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property LeafCapacity must be Tools::VT_ULONG", "IndexProperty_GetLeafCapacity"); return 0; } - + return var.m_val.ulVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property LeafCapacity was empty", + Error_PushError(RT_Failure, + "Property LeafCapacity was empty", "IndexProperty_GetLeafCapacity"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetPagesize( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetPagesize( IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetPagesize", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetPagesize", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1403,21 +2236,21 @@ SIDX_C_DLL RTError IndexProperty_SetPagesize( IndexPropertyH hProp, prop->setProperty("PageSize", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetPagesize"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetPagesize"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetPagesize"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1425,7 +2258,7 @@ SIDX_C_DLL RTError IndexProperty_SetPagesize( IndexPropertyH hProp, SIDX_C_DLL uint32_t IndexProperty_GetPagesize(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetPagesize", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("PageSize"); @@ -1433,27 +2266,27 @@ SIDX_C_DLL uint32_t IndexProperty_GetPagesize(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property PageSize must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property PageSize must be Tools::VT_ULONG", "IndexProperty_GetPagesize"); return 0; } - + return var.m_val.ulVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property PageSize was empty", + Error_PushError(RT_Failure, + "Property PageSize was empty", "IndexProperty_GetPagesize"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetLeafPoolCapacity( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetLeafPoolCapacity( IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetLeafPoolCapacity", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetLeafPoolCapacity", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1463,21 +2296,21 @@ SIDX_C_DLL RTError IndexProperty_SetLeafPoolCapacity( IndexPropertyH hProp, prop->setProperty("LeafPoolCapacity", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetLeafPoolCapacity"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetLeafPoolCapacity"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetLeafPoolCapacity"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1485,7 +2318,7 @@ SIDX_C_DLL RTError IndexProperty_SetLeafPoolCapacity( IndexPropertyH hProp, SIDX_C_DLL uint32_t IndexProperty_GetLeafPoolCapacity(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetLeafPoolCapacity", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("LeafPoolCapacity"); @@ -1493,27 +2326,27 @@ SIDX_C_DLL uint32_t IndexProperty_GetLeafPoolCapacity(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property LeafPoolCapacity must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property LeafPoolCapacity must be Tools::VT_ULONG", "IndexProperty_GetLeafPoolCapacity"); return 0; } - + return var.m_val.ulVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property LeafPoolCapacity was empty", + Error_PushError(RT_Failure, + "Property LeafPoolCapacity was empty", "IndexProperty_GetLeafPoolCapacity"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetIndexPoolCapacity(IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetIndexPoolCapacity(IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexPoolCapacity", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexPoolCapacity", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1523,21 +2356,21 @@ SIDX_C_DLL RTError IndexProperty_SetIndexPoolCapacity(IndexPropertyH hProp, prop->setProperty("IndexPoolCapacity", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetIndexPoolCapacity"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetIndexPoolCapacity"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetIndexPoolCapacity"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1545,7 +2378,7 @@ SIDX_C_DLL RTError IndexProperty_SetIndexPoolCapacity(IndexPropertyH hProp, SIDX_C_DLL uint32_t IndexProperty_GetIndexPoolCapacity(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetIndexPoolCapacity", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("IndexPoolCapacity"); @@ -1553,27 +2386,27 @@ SIDX_C_DLL uint32_t IndexProperty_GetIndexPoolCapacity(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property IndexPoolCapacity must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property IndexPoolCapacity must be Tools::VT_ULONG", "IndexProperty_GetIndexPoolCapacity"); return 0; } - + return var.m_val.ulVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property IndexPoolCapacity was empty", + Error_PushError(RT_Failure, + "Property IndexPoolCapacity was empty", "IndexProperty_GetIndexPoolCapacity"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetRegionPoolCapacity(IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetRegionPoolCapacity(IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetRegionPoolCapacity", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetRegionPoolCapacity", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1583,21 +2416,21 @@ SIDX_C_DLL RTError IndexProperty_SetRegionPoolCapacity(IndexPropertyH hProp, prop->setProperty("RegionPoolCapacity", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetRegionPoolCapacity"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetRegionPoolCapacity"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetRegionPoolCapacity"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1605,7 +2438,7 @@ SIDX_C_DLL RTError IndexProperty_SetRegionPoolCapacity(IndexPropertyH hProp, SIDX_C_DLL uint32_t IndexProperty_GetRegionPoolCapacity(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetRegionPoolCapacity", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("RegionPoolCapacity"); @@ -1613,27 +2446,27 @@ SIDX_C_DLL uint32_t IndexProperty_GetRegionPoolCapacity(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property RegionPoolCapacity must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property RegionPoolCapacity must be Tools::VT_ULONG", "IndexProperty_GetRegionPoolCapacity"); return 0; } - + return var.m_val.ulVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property RegionPoolCapacity was empty", + Error_PushError(RT_Failure, + "Property RegionPoolCapacity was empty", "IndexProperty_GetRegionPoolCapacity"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetPointPoolCapacity(IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetPointPoolCapacity(IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetPointPoolCapacity", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetPointPoolCapacity", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1643,21 +2476,21 @@ SIDX_C_DLL RTError IndexProperty_SetPointPoolCapacity(IndexPropertyH hProp, prop->setProperty("PointPoolCapacity", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetPointPoolCapacity"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetPointPoolCapacity"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetPointPoolCapacity"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1665,7 +2498,7 @@ SIDX_C_DLL RTError IndexProperty_SetPointPoolCapacity(IndexPropertyH hProp, SIDX_C_DLL uint32_t IndexProperty_GetPointPoolCapacity(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetPointPoolCapacity", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("PointPoolCapacity"); @@ -1673,29 +2506,29 @@ SIDX_C_DLL uint32_t IndexProperty_GetPointPoolCapacity(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property PointPoolCapacity must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property PointPoolCapacity must be Tools::VT_ULONG", "IndexProperty_GetPointPoolCapacity"); return 0; } - + return var.m_val.ulVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property PointPoolCapacity was empty", + Error_PushError(RT_Failure, + "Property PointPoolCapacity was empty", "IndexProperty_GetPointPoolCapacity"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetNearMinimumOverlapFactor( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetNearMinimumOverlapFactor( IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1( hProp, - "IndexProperty_SetNearMinimumOverlapFactor", - RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1( hProp, + "IndexProperty_SetNearMinimumOverlapFactor", + RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1705,21 +2538,21 @@ SIDX_C_DLL RTError IndexProperty_SetNearMinimumOverlapFactor( IndexPropertyH hPr prop->setProperty("NearMinimumOverlapFactor", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetNearMinimumOverlapFactor"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetNearMinimumOverlapFactor"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetNearMinimumOverlapFactor"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1727,7 +2560,7 @@ SIDX_C_DLL RTError IndexProperty_SetNearMinimumOverlapFactor( IndexPropertyH hPr SIDX_C_DLL uint32_t IndexProperty_GetNearMinimumOverlapFactor(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetNearMinimumOverlapFactor", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("NearMinimumOverlapFactor"); @@ -1735,28 +2568,28 @@ SIDX_C_DLL uint32_t IndexProperty_GetNearMinimumOverlapFactor(IndexPropertyH hPr if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property NearMinimumOverlapFactor must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property NearMinimumOverlapFactor must be Tools::VT_ULONG", "IndexProperty_GetNearMinimumOverlapFactor"); return 0; } - + return var.m_val.ulVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property NearMinimumOverlapFactor was empty", + Error_PushError(RT_Failure, + "Property NearMinimumOverlapFactor was empty", "IndexProperty_GetNearMinimumOverlapFactor"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetBufferingCapacity(IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetBufferingCapacity(IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetBufferingCapacity", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetBufferingCapacity", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -1766,21 +2599,21 @@ SIDX_C_DLL RTError IndexProperty_SetBufferingCapacity(IndexPropertyH hProp, prop->setProperty("Capacity", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetBufferingCapacity"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetBufferingCapacity"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetBufferingCapacity"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1788,7 +2621,7 @@ SIDX_C_DLL RTError IndexProperty_SetBufferingCapacity(IndexPropertyH hProp, SIDX_C_DLL uint32_t IndexProperty_GetBufferingCapacity(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetBufferingCapacity", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("Capacity"); @@ -1796,57 +2629,57 @@ SIDX_C_DLL uint32_t IndexProperty_GetBufferingCapacity(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property Capacity must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property Capacity must be Tools::VT_ULONG", "IndexProperty_GetBufferingCapacity"); return 0; } - + return var.m_val.ulVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property Capacity was empty", + Error_PushError(RT_Failure, + "Property Capacity was empty", "IndexProperty_GetBufferingCapacity"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetEnsureTightMBRs( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetEnsureTightMBRs( IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetEnsureTightMBRs", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetEnsureTightMBRs", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { if (value > 1 ) { - Error_PushError(RT_Failure, - "EnsureTightMBRs is a boolean value and must be 1 or 0", + Error_PushError(RT_Failure, + "EnsureTightMBRs is a boolean value and must be 1 or 0", "IndexProperty_SetEnsureTightMBRs"); return RT_Failure; } Tools::Variant var; var.m_varType = Tools::VT_BOOL; - var.m_val.blVal = (bool)value; + var.m_val.blVal = value != 0; prop->setProperty("EnsureTightMBRs", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetEnsureTightMBRs"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetEnsureTightMBRs"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetEnsureTightMBRs"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1854,7 +2687,7 @@ SIDX_C_DLL RTError IndexProperty_SetEnsureTightMBRs( IndexPropertyH hProp, SIDX_C_DLL uint32_t IndexProperty_GetEnsureTightMBRs(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetEnsureTightMBRs", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("EnsureTightMBRs"); @@ -1862,57 +2695,57 @@ SIDX_C_DLL uint32_t IndexProperty_GetEnsureTightMBRs(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_BOOL) { - Error_PushError(RT_Failure, - "Property EnsureTightMBRs must be Tools::VT_BOOL", + Error_PushError(RT_Failure, + "Property EnsureTightMBRs must be Tools::VT_BOOL", "IndexProperty_GetEnsureTightMBRs"); return 0; } - + return var.m_val.blVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property EnsureTightMBRs was empty", + Error_PushError(RT_Failure, + "Property EnsureTightMBRs was empty", "IndexProperty_GetEnsureTightMBRs"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetWriteThrough(IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetWriteThrough(IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetWriteThrough", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetWriteThrough", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { if (value > 1 ) { - Error_PushError(RT_Failure, - "WriteThrough is a boolean value and must be 1 or 0", + Error_PushError(RT_Failure, + "WriteThrough is a boolean value and must be 1 or 0", "IndexProperty_SetWriteThrough"); return RT_Failure; } Tools::Variant var; var.m_varType = Tools::VT_BOOL; - var.m_val.blVal = value; + var.m_val.blVal = value != 0; prop->setProperty("WriteThrough", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetWriteThrough"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetWriteThrough"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetWriteThrough"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1920,7 +2753,7 @@ SIDX_C_DLL RTError IndexProperty_SetWriteThrough(IndexPropertyH hProp, SIDX_C_DLL uint32_t IndexProperty_GetWriteThrough(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetWriteThrough", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("WriteThrough"); @@ -1928,57 +2761,57 @@ SIDX_C_DLL uint32_t IndexProperty_GetWriteThrough(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_BOOL) { - Error_PushError(RT_Failure, - "Property WriteThrough must be Tools::VT_BOOL", + Error_PushError(RT_Failure, + "Property WriteThrough must be Tools::VT_BOOL", "IndexProperty_GetWriteThrough"); return 0; } - + return var.m_val.blVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property WriteThrough was empty", + Error_PushError(RT_Failure, + "Property WriteThrough was empty", "IndexProperty_GetWriteThrough"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetOverwrite(IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetOverwrite(IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetOverwrite", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetOverwrite", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { if (value > 1 ) { - Error_PushError(RT_Failure, - "Overwrite is a boolean value and must be 1 or 0", + Error_PushError(RT_Failure, + "Overwrite is a boolean value and must be 1 or 0", "IndexProperty_SetOverwrite"); return RT_Failure; } Tools::Variant var; var.m_varType = Tools::VT_BOOL; - var.m_val.blVal = value; + var.m_val.blVal = value != 0; prop->setProperty("Overwrite", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetOverwrite"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetOverwrite"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetOverwrite"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -1986,7 +2819,7 @@ SIDX_C_DLL RTError IndexProperty_SetOverwrite(IndexPropertyH hProp, SIDX_C_DLL uint32_t IndexProperty_GetOverwrite(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetOverwrite", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("Overwrite"); @@ -1994,28 +2827,28 @@ SIDX_C_DLL uint32_t IndexProperty_GetOverwrite(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_BOOL) { - Error_PushError(RT_Failure, - "Property Overwrite must be Tools::VT_BOOL", + Error_PushError(RT_Failure, + "Property Overwrite must be Tools::VT_BOOL", "IndexProperty_GetOverwrite"); return 0; } - + return var.m_val.blVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property Overwrite was empty", + Error_PushError(RT_Failure, + "Property Overwrite was empty", "IndexProperty_GetOverwrite"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetFillFactor( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetFillFactor( IndexPropertyH hProp, double value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetFillFactor", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetFillFactor", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -2025,21 +2858,21 @@ SIDX_C_DLL RTError IndexProperty_SetFillFactor( IndexPropertyH hProp, prop->setProperty("FillFactor", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetFillFactor"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetFillFactor"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetFillFactor"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -2047,7 +2880,7 @@ SIDX_C_DLL RTError IndexProperty_SetFillFactor( IndexPropertyH hProp, SIDX_C_DLL double IndexProperty_GetFillFactor(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetFillFactor", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("FillFactor"); @@ -2055,29 +2888,29 @@ SIDX_C_DLL double IndexProperty_GetFillFactor(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_DOUBLE) { - Error_PushError(RT_Failure, - "Property FillFactor must be Tools::VT_DOUBLE", + Error_PushError(RT_Failure, + "Property FillFactor must be Tools::VT_DOUBLE", "IndexProperty_GetFillFactor"); return 0; } - + return var.m_val.dblVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property FillFactor was empty", + Error_PushError(RT_Failure, + "Property FillFactor was empty", "IndexProperty_GetFillFactor"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetSplitDistributionFactor( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetSplitDistributionFactor( IndexPropertyH hProp, double value) { - VALIDATE_POINTER1( hProp, - "IndexProperty_SetSplitDistributionFactor", - RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1( hProp, + "IndexProperty_SetSplitDistributionFactor", + RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -2087,21 +2920,21 @@ SIDX_C_DLL RTError IndexProperty_SetSplitDistributionFactor( IndexPropertyH hPr prop->setProperty("SplitDistributionFactor", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetSplitDistributionFactor"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetSplitDistributionFactor"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetSplitDistributionFactor"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -2109,7 +2942,7 @@ SIDX_C_DLL RTError IndexProperty_SetSplitDistributionFactor( IndexPropertyH hPr SIDX_C_DLL double IndexProperty_GetSplitDistributionFactor(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetSplitDistributionFactor", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("SplitDistributionFactor"); @@ -2117,29 +2950,29 @@ SIDX_C_DLL double IndexProperty_GetSplitDistributionFactor(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_DOUBLE) { - Error_PushError(RT_Failure, - "Property SplitDistributionFactor must be Tools::VT_DOUBLE", + Error_PushError(RT_Failure, + "Property SplitDistributionFactor must be Tools::VT_DOUBLE", "IndexProperty_GetSplitDistributionFactor"); return 0; } - + return var.m_val.dblVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property SplitDistributionFactor was empty", + Error_PushError(RT_Failure, + "Property SplitDistributionFactor was empty", "IndexProperty_GetSplitDistributionFactor"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetTPRHorizon(IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetTPRHorizon(IndexPropertyH hProp, double value) { - VALIDATE_POINTER1( hProp, - "IndexProperty_SetTPRHorizon", - RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1( hProp, + "IndexProperty_SetTPRHorizon", + RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -2149,21 +2982,21 @@ SIDX_C_DLL RTError IndexProperty_SetTPRHorizon(IndexPropertyH hProp, prop->setProperty("Horizon", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetTPRHorizon"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetTPRHorizon"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetTPRHorizon"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -2171,7 +3004,7 @@ SIDX_C_DLL RTError IndexProperty_SetTPRHorizon(IndexPropertyH hProp, SIDX_C_DLL double IndexProperty_GetTPRHorizon(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetTPRHorizon", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("Horizon"); @@ -2179,29 +3012,29 @@ SIDX_C_DLL double IndexProperty_GetTPRHorizon(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_DOUBLE) { - Error_PushError(RT_Failure, - "Property Horizon must be Tools::VT_DOUBLE", + Error_PushError(RT_Failure, + "Property Horizon must be Tools::VT_DOUBLE", "IndexProperty_GetTPRHorizon"); return 0; } - + return var.m_val.dblVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property Horizon was empty", + Error_PushError(RT_Failure, + "Property Horizon was empty", "IndexProperty_GetTPRHorizon"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetReinsertFactor( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetReinsertFactor( IndexPropertyH hProp, double value) { - VALIDATE_POINTER1( hProp, - "IndexProperty_SetReinsertFactor", - RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1( hProp, + "IndexProperty_SetReinsertFactor", + RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -2211,21 +3044,21 @@ SIDX_C_DLL RTError IndexProperty_SetReinsertFactor( IndexPropertyH hProp, prop->setProperty("ReinsertFactor", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetReinsertFactor"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetReinsertFactor"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetReinsertFactor"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -2233,7 +3066,7 @@ SIDX_C_DLL RTError IndexProperty_SetReinsertFactor( IndexPropertyH hProp, SIDX_C_DLL double IndexProperty_GetReinsertFactor(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetReinsertFactor", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("ReinsertFactor"); @@ -2241,29 +3074,29 @@ SIDX_C_DLL double IndexProperty_GetReinsertFactor(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_DOUBLE) { - Error_PushError(RT_Failure, - "Property ReinsertFactor must be Tools::VT_DOUBLE", + Error_PushError(RT_Failure, + "Property ReinsertFactor must be Tools::VT_DOUBLE", "IndexProperty_GetReinsertFactor"); return 0; } - + return var.m_val.dblVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property ReinsertFactor was empty", + Error_PushError(RT_Failure, + "Property ReinsertFactor was empty", "IndexProperty_GetReinsertFactor"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetFileName( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetFileName( IndexPropertyH hProp, const char* value) { - VALIDATE_POINTER1( hProp, - "IndexProperty_SetFileName", - RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1( hProp, + "IndexProperty_SetFileName", + RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -2273,21 +3106,21 @@ SIDX_C_DLL RTError IndexProperty_SetFileName( IndexPropertyH hProp, prop->setProperty("FileName", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetFileName"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetFileName"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetFileName"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -2295,7 +3128,7 @@ SIDX_C_DLL RTError IndexProperty_SetFileName( IndexPropertyH hProp, SIDX_C_DLL char* IndexProperty_GetFileName(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetFileName", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("FileName"); @@ -2303,30 +3136,30 @@ SIDX_C_DLL char* IndexProperty_GetFileName(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_PCHAR) { - Error_PushError(RT_Failure, - "Property FileName must be Tools::VT_PCHAR", + Error_PushError(RT_Failure, + "Property FileName must be Tools::VT_PCHAR", "IndexProperty_GetFileName"); return NULL; } - + return STRDUP(var.m_val.pcVal); } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property FileName was empty", + Error_PushError(RT_Failure, + "Property FileName was empty", "IndexProperty_GetFileName"); return NULL; } -SIDX_C_DLL RTError IndexProperty_SetFileNameExtensionDat( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetFileNameExtensionDat( IndexPropertyH hProp, const char* value) { - VALIDATE_POINTER1( hProp, - "IndexProperty_SetFileNameExtensionDat", - RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1( hProp, + "IndexProperty_SetFileNameExtensionDat", + RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -2337,21 +3170,21 @@ SIDX_C_DLL RTError IndexProperty_SetFileNameExtensionDat( IndexPropertyH hProp, } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetFileNameExtensionDat"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetFileNameExtensionDat"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetFileNameExtensionDat"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -2359,7 +3192,7 @@ SIDX_C_DLL RTError IndexProperty_SetFileNameExtensionDat( IndexPropertyH hProp, SIDX_C_DLL char* IndexProperty_GetFileNameExtensionDat(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetFileNameExtensionDat", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("FileNameDat"); @@ -2367,29 +3200,29 @@ SIDX_C_DLL char* IndexProperty_GetFileNameExtensionDat(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_PCHAR) { - Error_PushError(RT_Failure, - "Property FileNameDat must be Tools::VT_PCHAR", + Error_PushError(RT_Failure, + "Property FileNameDat must be Tools::VT_PCHAR", "IndexProperty_GetFileNameExtensionDat"); return NULL; } - + return STRDUP(var.m_val.pcVal); } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property FileNameDat was empty", + Error_PushError(RT_Failure, + "Property FileNameDat was empty", "IndexProperty_GetFileNameExtensionDat"); return NULL; } -SIDX_C_DLL RTError IndexProperty_SetFileNameExtensionIdx( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetFileNameExtensionIdx( IndexPropertyH hProp, const char* value) { - VALIDATE_POINTER1( hProp, - "IndexProperty_SetFileNameExtensionIdx", - RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1( hProp, + "IndexProperty_SetFileNameExtensionIdx", + RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -2400,21 +3233,21 @@ SIDX_C_DLL RTError IndexProperty_SetFileNameExtensionIdx( IndexPropertyH hProp, } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetFileNameExtensionIdx"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetFileNameExtensionIdx"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetFileNameExtensionIdx"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -2422,7 +3255,7 @@ SIDX_C_DLL RTError IndexProperty_SetFileNameExtensionIdx( IndexPropertyH hProp, SIDX_C_DLL char* IndexProperty_GetFileNameExtensionIdx(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetFileNameExtensionIdx", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("FileNameIdx"); @@ -2430,27 +3263,27 @@ SIDX_C_DLL char* IndexProperty_GetFileNameExtensionIdx(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_PCHAR) { - Error_PushError(RT_Failure, - "Property FileNameIdx must be Tools::VT_PCHAR", + Error_PushError(RT_Failure, + "Property FileNameIdx must be Tools::VT_PCHAR", "IndexProperty_GetFileNameExtensionIdx"); return NULL; } - + return STRDUP(var.m_val.pcVal); } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property FileNameIdx was empty", + Error_PushError(RT_Failure, + "Property FileNameIdx was empty", "IndexProperty_GetFileNameExtensionIdx"); return NULL; } -SIDX_C_DLL RTError IndexProperty_SetCustomStorageCallbacksSize(IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetCustomStorageCallbacksSize(IndexPropertyH hProp, uint32_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetCustomStorageCallbacksSize", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetCustomStorageCallbacksSize", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -2460,21 +3293,21 @@ SIDX_C_DLL RTError IndexProperty_SetCustomStorageCallbacksSize(IndexPropertyH hP prop->setProperty("CustomStorageCallbacksSize", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetCustomStorageCallbacksSize"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetCustomStorageCallbacksSize"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetCustomStorageCallbacksSize"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -2482,7 +3315,7 @@ SIDX_C_DLL RTError IndexProperty_SetCustomStorageCallbacksSize(IndexPropertyH hP SIDX_C_DLL uint32_t IndexProperty_GetCustomStorageCallbacksSize(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetCustomStorageCallbacksSize", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("CustomStorageCallbacksSize"); @@ -2490,29 +3323,29 @@ SIDX_C_DLL uint32_t IndexProperty_GetCustomStorageCallbacksSize(IndexPropertyH h if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_ULONG) { - Error_PushError(RT_Failure, - "Property CustomStorageCallbacksSize must be Tools::VT_ULONG", + Error_PushError(RT_Failure, + "Property CustomStorageCallbacksSize must be Tools::VT_ULONG", "IndexProperty_GetCustomStorageCallbacksSize"); return 0; } - + return var.m_val.ulVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property CustomStorageCallbacksSize was empty", + Error_PushError(RT_Failure, + "Property CustomStorageCallbacksSize was empty", "IndexProperty_GetCustomStorageCallbacksSize"); return 0; } -SIDX_C_DLL RTError IndexProperty_SetCustomStorageCallbacks( IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetCustomStorageCallbacks( IndexPropertyH hProp, const void* value) { - VALIDATE_POINTER1( hProp, - "IndexProperty_SetCustomStorageCallbacks", - RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1( hProp, + "IndexProperty_SetCustomStorageCallbacks", + RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); // check if the CustomStorageCallbacksSize is alright, so we can make a copy of the passed in structure Tools::Variant varSize; @@ -2521,10 +3354,10 @@ SIDX_C_DLL RTError IndexProperty_SetCustomStorageCallbacks( IndexPropertyH hProp { std::ostringstream ss; ss << "The supplied storage callbacks size is wrong, expected " - << sizeof(SpatialIndex::StorageManager::CustomStorageManagerCallbacks) + << sizeof(SpatialIndex::StorageManager::CustomStorageManagerCallbacks) << ", got " << varSize.m_val.ulVal; - Error_PushError(RT_Failure, - ss.str().c_str(), + Error_PushError(RT_Failure, + ss.str().c_str(), "IndexProperty_SetCustomStorageCallbacks"); return RT_Failure; } @@ -2533,30 +3366,30 @@ SIDX_C_DLL RTError IndexProperty_SetCustomStorageCallbacks( IndexPropertyH hProp { Tools::Variant var; var.m_varType = Tools::VT_PVOID; - var.m_val.pvVal = value ? - new SpatialIndex::StorageManager::CustomStorageManagerCallbacks( - *static_cast(value) - ) + var.m_val.pvVal = value ? + new SpatialIndex::StorageManager::CustomStorageManagerCallbacks( + *static_cast(value) + ) : 0; prop->setProperty("CustomStorageCallbacks", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetCustomStorageCallbacks"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetCustomStorageCallbacks"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetCustomStorageCallbacks"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -2564,7 +3397,7 @@ SIDX_C_DLL RTError IndexProperty_SetCustomStorageCallbacks( IndexPropertyH hProp SIDX_C_DLL void* IndexProperty_GetCustomStorageCallbacks(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetCustomStorageCallbacks", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("CustomStorageCallbacks"); @@ -2572,27 +3405,27 @@ SIDX_C_DLL void* IndexProperty_GetCustomStorageCallbacks(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_PVOID) { - Error_PushError(RT_Failure, - "Property CustomStorageCallbacks must be Tools::VT_PVOID", + Error_PushError(RT_Failure, + "Property CustomStorageCallbacks must be Tools::VT_PVOID", "IndexProperty_GetCustomStorageCallbacks"); return NULL; } - + return var.m_val.pvVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property CustomStorageCallbacks was empty", + Error_PushError(RT_Failure, + "Property CustomStorageCallbacks was empty", "IndexProperty_GetCustomStorageCallbacks"); return NULL; } -SIDX_C_DLL RTError IndexProperty_SetIndexID(IndexPropertyH hProp, +SIDX_C_DLL RTError IndexProperty_SetIndexID(IndexPropertyH hProp, int64_t value) { - VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexID", RT_Failure); - Tools::PropertySet* prop = static_cast(hProp); + VALIDATE_POINTER1(hProp, "IndexProperty_SetIndexID", RT_Failure); + Tools::PropertySet* prop = reinterpret_cast(hProp); try { @@ -2602,21 +3435,21 @@ SIDX_C_DLL RTError IndexProperty_SetIndexID(IndexPropertyH hProp, prop->setProperty("IndexIdentifier", var); } catch (Tools::Exception& e) { - Error_PushError(RT_Failure, - e.what().c_str(), + Error_PushError(RT_Failure, + e.what().c_str(), "IndexProperty_SetIndexID"); return RT_Failure; } catch (std::exception const& e) { - Error_PushError(RT_Failure, - e.what(), + Error_PushError(RT_Failure, + e.what(), "IndexProperty_SetIndexID"); return RT_Failure; } catch (...) { - Error_PushError(RT_Failure, - "Unknown Error", + Error_PushError(RT_Failure, + "Unknown Error", "IndexProperty_SetIndexID"); - return RT_Failure; + return RT_Failure; } return RT_None; } @@ -2624,7 +3457,7 @@ SIDX_C_DLL RTError IndexProperty_SetIndexID(IndexPropertyH hProp, SIDX_C_DLL int64_t IndexProperty_GetIndexID(IndexPropertyH hProp) { VALIDATE_POINTER1(hProp, "IndexProperty_GetIndexID", 0); - Tools::PropertySet* prop = static_cast(hProp); + Tools::PropertySet* prop = reinterpret_cast(hProp); Tools::Variant var; var = prop->getProperty("IndexIdentifier"); @@ -2632,18 +3465,18 @@ SIDX_C_DLL int64_t IndexProperty_GetIndexID(IndexPropertyH hProp) if (var.m_varType != Tools::VT_EMPTY) { if (var.m_varType != Tools::VT_LONGLONG) { - Error_PushError(RT_Failure, - "Property IndexIdentifier must be Tools::VT_LONGLONG", + Error_PushError(RT_Failure, + "Property IndexIdentifier must be Tools::VT_LONGLONG", "IndexProperty_GetIndexID"); return 0; } - + return var.m_val.llVal; } - + // return nothing for an error - Error_PushError(RT_Failure, - "Property IndexIdentifier was empty", + Error_PushError(RT_Failure, + "Property IndexIdentifier was empty", "IndexProperty_GetIndexID"); return 0; } @@ -2652,7 +3485,68 @@ SIDX_C_DLL void* SIDX_NewBuffer(size_t length) { return new char[length]; } - + +SIDX_DLL RTError IndexProperty_SetResultSetLimit(IndexPropertyH hProp, uint64_t value) +{ + VALIDATE_POINTER1(hProp, "IndexProperty_SetResultSetLimit", RT_Failure); + + Tools::PropertySet* prop = reinterpret_cast(hProp); + + try + { + Tools::Variant var; + var.m_varType = Tools::VT_LONGLONG; + var.m_val.llVal = value; + prop->setProperty("ResultSetLimit", var); + } catch (Tools::Exception& e) + { + Error_PushError(RT_Failure, + e.what().c_str(), + "IndexProperty_SetResultSetLimit"); + return RT_Failure; + } catch (std::exception const& e) + { + Error_PushError(RT_Failure, + e.what(), + "IndexProperty_SetResultSetLimit"); + return RT_Failure; + } catch (...) { + Error_PushError(RT_Failure, + "Unknown Error", + "IndexProperty_SetResultSetLimit"); + return RT_Failure; + } + return RT_None; +} + +SIDX_DLL uint64_t IndexProperty_GetResultSetLimit(IndexPropertyH hProp) +{ + VALIDATE_POINTER1(hProp, "IndexProperty_GetResultSetLimit", 0); + Tools::PropertySet* prop = reinterpret_cast(hProp); + + Tools::Variant var; + var = prop->getProperty("ResultSetLimit"); + + if (var.m_varType != Tools::VT_EMPTY) + { + if (var.m_varType != Tools::VT_LONGLONG) { + Error_PushError(RT_Failure, + "Property ResultSetLimit must be Tools::VT_LONGLONG", + "IndexProperty_GetResultSetLimit"); + return 0; + } + + return var.m_val.llVal; + } + + // return nothing for an error + Error_PushError(RT_Failure, + "Property ResultSetLimit was empty", + "IndexProperty_GetResultSetLimit"); + return 0; +} + + SIDX_C_DLL void SIDX_DeleteBuffer(void* buffer) { delete [] static_cast(buffer); @@ -2661,7 +3555,7 @@ SIDX_C_DLL void SIDX_DeleteBuffer(void* buffer) SIDX_C_DLL char* SIDX_Version() { - + std::ostringstream ot; #ifdef SIDX_RELEASE_NAME @@ -2672,6 +3566,12 @@ SIDX_C_DLL char* SIDX_Version() std::string out(ot.str()); return STRDUP(out.c_str()); - + } IDX_C_END + +#ifdef _WIN32 +# pragma warning(pop) +#endif + + diff --git a/support/spatialindex/src/libspatialindex.pc.in b/support/spatialindex/src/libspatialindex.pc.in index a9563ed8..d1a58e6e 100644 --- a/support/spatialindex/src/libspatialindex.pc.in +++ b/support/spatialindex/src/libspatialindex.pc.in @@ -7,6 +7,6 @@ Name: libspatialindex Description: Generic C/C++ library for spatial indexing Requires: Version: @PACKAGE_VERSION@ -Libs: -L@libdir@ @LDFLAGS@ +Libs: -L@libdir@ Cflags: -I${includedir}/spatialindex @CFLAGS@ @CPPFLAGS@ diff --git a/support/spatialindex/src/mvrtree/Leaf.cc b/support/spatialindex/src/mvrtree/Leaf.cc index ff4e6be7..1a6ae27b 100644 --- a/support/spatialindex/src/mvrtree/Leaf.cc +++ b/support/spatialindex/src/mvrtree/Leaf.cc @@ -42,14 +42,14 @@ Leaf::Leaf(SpatialIndex::MVRTree::MVRTree* pTree, id_type id): Node(pTree, id, 0 { } -NodePtr Leaf::chooseSubtree(const TimeRegion& mbr, uint32_t level, std::stack& pathBuffer) +NodePtr Leaf::chooseSubtree(const TimeRegion&, uint32_t, std::stack&) { // should make sure to relinquish other PoolPointer lists that might be pointing to the // same leaf. return NodePtr(this, &(m_pTree->m_leafPool)); } -NodePtr Leaf::findLeaf(const TimeRegion& mbr, id_type id, std::stack& pathBuffer) +NodePtr Leaf::findLeaf(const TimeRegion& mbr, id_type id, std::stack&) { for (uint32_t cChild = 0; cChild < m_children; ++cChild) { diff --git a/support/spatialindex/src/mvrtree/MVRTree.cc b/support/spatialindex/src/mvrtree/MVRTree.cc index a8fde0b8..8910aa1a 100644 --- a/support/spatialindex/src/mvrtree/MVRTree.cc +++ b/support/spatialindex/src/mvrtree/MVRTree.cc @@ -5,7 +5,7 @@ * Copyright (c) 2002, Marios Hadjieleftheriou * * 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 @@ -220,7 +220,7 @@ SpatialIndex::MVRTree::MVRTree::MVRTree(IStorageManager& sm, Tools::PropertySet& m_leafPool(100) { #ifdef HAVE_PTHREAD_H - Tools::LockGuard lock(&m_lock); + pthread_mutex_init(&m_lock, NULL); #endif Tools::Variant var = ps.getProperty("IndexIdentifier"); @@ -245,7 +245,7 @@ SpatialIndex::MVRTree::MVRTree::MVRTree(IStorageManager& sm, Tools::PropertySet& SpatialIndex::MVRTree::MVRTree::~MVRTree() { #ifdef HAVE_PTHREAD_H - Tools::LockGuard lock(&m_lock); + pthread_mutex_destroy(&m_lock); #endif storeHeader(); @@ -337,7 +337,7 @@ void SpatialIndex::MVRTree::MVRTree::pointLocationQuery(const Point& query, IVis rangeQuery(IntersectionQuery, r, v); } -void SpatialIndex::MVRTree::MVRTree::nearestNeighborQuery(uint32_t k, const IShape& query, IVisitor& v, INearestNeighborComparator& nnc) +void SpatialIndex::MVRTree::MVRTree::nearestNeighborQuery(uint32_t, const IShape&, IVisitor&, INearestNeighborComparator&) { throw Tools::IllegalStateException("nearestNeighborQuery: not impelmented yet."); } @@ -349,7 +349,7 @@ void SpatialIndex::MVRTree::MVRTree::nearestNeighborQuery(uint32_t k, const ISha nearestNeighborQuery(k, query, v, nnc); } -void SpatialIndex::MVRTree::MVRTree::selfJoinQuery(const IShape& query, IVisitor& v) +void SpatialIndex::MVRTree::MVRTree::selfJoinQuery(const IShape&, IVisitor&) { throw Tools::IllegalStateException("selfJoinQuery: not impelmented yet."); } @@ -453,6 +453,10 @@ void SpatialIndex::MVRTree::MVRTree::getIndexProperties(Tools::PropertySet& out) var.m_varType = Tools::VT_DOUBLE; var.m_val.dblVal = m_versionUnderflow; out.setProperty("VersionUnderflow", var); + + var.m_varType = Tools::VT_LONGLONG; + var.m_val.llVal = m_headerID; + out.setProperty("IndexIdentifier", var); } void SpatialIndex::MVRTree::MVRTree::addCommand(ICommand* pCommand, CommandType ct) @@ -566,6 +570,11 @@ void SpatialIndex::MVRTree::MVRTree::getStatistics(IStatistics** out) const *out = new Statistics(m_stats); } +void SpatialIndex::MVRTree::MVRTree::flush() +{ + storeHeader(); +} + void SpatialIndex::MVRTree::MVRTree::initNew(Tools::PropertySet& ps) { Tools::Variant var; diff --git a/support/spatialindex/src/mvrtree/MVRTree.h b/support/spatialindex/src/mvrtree/MVRTree.h index 0ebb0ea5..cc025137 100644 --- a/support/spatialindex/src/mvrtree/MVRTree.h +++ b/support/spatialindex/src/mvrtree/MVRTree.h @@ -81,6 +81,7 @@ namespace SpatialIndex virtual void addCommand(ICommand* pCommand, CommandType ct); virtual bool isIndexValid(); virtual void getStatistics(IStatistics** out) const; + virtual void flush(); private: void initNew(Tools::PropertySet&); diff --git a/support/spatialindex/src/mvrtree/Makefile.in b/support/spatialindex/src/mvrtree/Makefile.in deleted file mode 100644 index 9687e622..00000000 --- a/support/spatialindex/src/mvrtree/Makefile.in +++ /dev/null @@ -1,569 +0,0 @@ -# Makefile.in generated by automake 1.13.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2012 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@ -am__make_dryrun = \ - { \ - am__dry=no; \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ - esac; \ - test $$am__dry = yes; \ - } -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@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@ -subdir = src/mvrtree -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) -libmvrtree_la_LIBADD = -am_libmvrtree_la_OBJECTS = Index.lo Leaf.lo Node.lo MVRTree.lo \ - Statistics.lo -libmvrtree_la_OBJECTS = $(am_libmvrtree_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_@AM_V@) -am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo " CXX " $@; -am__v_CXX_1 = -CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ - $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) -am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo " CXXLD " $@; -am__v_CXXLD_1 = -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(libmvrtree_la_SOURCES) -DIST_SOURCES = $(libmvrtree_la_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -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@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -noinst_LTLIBRARIES = libmvrtree.la -INCLUDES = -I../../include -libmvrtree_la_SOURCES = Index.cc Leaf.cc Node.cc MVRTree.cc Statistics.cc Index.h Leaf.h MVRTree.h Node.h PointerPoolNode.h Statistics.h -all: all-am - -.SUFFIXES: -.SUFFIXES: .cc .lo .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 ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/mvrtree/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/mvrtree/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 -$(am__aclocal_m4_deps): - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } -libmvrtree.la: $(libmvrtree_la_OBJECTS) $(libmvrtree_la_DEPENDENCIES) $(EXTRA_libmvrtree_la_DEPENDENCIES) - $(AM_V_CXXLD)$(CXXLINK) $(libmvrtree_la_OBJECTS) $(libmvrtree_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Index.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Leaf.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MVRTree.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Node.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Statistics.Plo@am__quote@ - -.cc.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< - -.cc.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cc.lo: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -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 "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$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 $(LTLIBRARIES) -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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libtool clean-noinstLTLIBRARIES \ - 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 - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -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 \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool 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 mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-am 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/support/spatialindex/src/mvrtree/Node.cc b/support/spatialindex/src/mvrtree/Node.cc index 3b1a6a2b..e09f5dfe 100644 --- a/support/spatialindex/src/mvrtree/Node.cc +++ b/support/spatialindex/src/mvrtree/Node.cc @@ -309,7 +309,7 @@ Node::~Node() if (m_pIdentifier != 0) delete[] m_pIdentifier; } -Node& Node::operator=(const Node& n) +Node& Node::operator=(const Node&) { throw Tools::IllegalStateException("operator =: This should never be called."); } diff --git a/support/spatialindex/src/rtree/Index.cc b/support/spatialindex/src/rtree/Index.cc index 17f4b59a..fed719a6 100644 --- a/support/spatialindex/src/rtree/Index.cc +++ b/support/spatialindex/src/rtree/Index.cc @@ -280,7 +280,7 @@ uint32_t Index::findLeastOverlap(const Region& r) const return ret; } -void Index::adjustTree(Node* n, std::stack& pathBuffer) +void Index::adjustTree(Node* n, std::stack& pathBuffer, bool force) { ++(m_pTree->m_stats.m_u64Adjustments); @@ -300,7 +300,7 @@ void Index::adjustTree(Node* n, std::stack& pathBuffer) *(m_ptrMBR[child]) = n->m_nodeMBR; - if (bRecompute) + if (bRecompute || force) { for (uint32_t cDim = 0; cDim < m_nodeMBR.m_dimension; ++cDim) { @@ -317,12 +317,12 @@ void Index::adjustTree(Node* n, std::stack& pathBuffer) m_pTree->writeNode(this); - if (bRecompute && (! pathBuffer.empty())) + if ((bRecompute || force) && (! pathBuffer.empty())) { id_type cParent = pathBuffer.top(); pathBuffer.pop(); NodePtr ptrN = m_pTree->readNode(cParent); Index* p = static_cast(ptrN.get()); - p->adjustTree(this, pathBuffer); + p->adjustTree(this, pathBuffer, force); } } @@ -338,9 +338,11 @@ void Index::adjustTree(Node* n1, Node* n2, std::stack& pathBuffer, byte } // MBR needs recalculation if either: - // 1. the NEW child MBR is not contained. + // 1. either child MBR is not contained. // 2. the OLD child MBR is touching. - bool bContained = m_nodeMBR.containsRegion(n1->m_nodeMBR); + bool bContained1 = m_nodeMBR.containsRegion(n1->m_nodeMBR); + bool bContained2 = m_nodeMBR.containsRegion(n2->m_nodeMBR); + bool bContained = bContained1 && bContained2; bool bTouches = m_nodeMBR.touchesRegion(*(m_ptrMBR[child])); bool bRecompute = (! bContained || (bTouches && m_pTree->m_bTightMBRs)); diff --git a/support/spatialindex/src/rtree/Index.h b/support/spatialindex/src/rtree/Index.h index fe461a5f..f850b6ca 100644 --- a/support/spatialindex/src/rtree/Index.h +++ b/support/spatialindex/src/rtree/Index.h @@ -47,7 +47,7 @@ namespace SpatialIndex uint32_t findLeastEnlargement(const Region&) const; uint32_t findLeastOverlap(const Region&) const; - void adjustTree(Node*, std::stack&); + void adjustTree(Node*, std::stack&, bool force = false); void adjustTree(Node*, Node*, std::stack&, byte* overflowTable); class OverlapEntry diff --git a/support/spatialindex/src/rtree/Leaf.cc b/support/spatialindex/src/rtree/Leaf.cc index 3dfb8af5..1a9feac2 100644 --- a/support/spatialindex/src/rtree/Leaf.cc +++ b/support/spatialindex/src/rtree/Leaf.cc @@ -45,14 +45,14 @@ Leaf::Leaf(SpatialIndex::RTree::RTree* pTree, id_type id): Node(pTree, id, 0, pT { } -NodePtr Leaf::chooseSubtree(const Region& mbr, uint32_t level, std::stack& pathBuffer) +NodePtr Leaf::chooseSubtree(const Region&, uint32_t, std::stack&) { // should make sure to relinquish other PoolPointer lists that might be pointing to the // same leaf. return NodePtr(this, &(m_pTree->m_leafPool)); } -NodePtr Leaf::findLeaf(const Region& mbr, id_type id, std::stack& pathBuffer) +NodePtr Leaf::findLeaf(const Region& mbr, id_type id, std::stack&) { for (uint32_t cChild = 0; cChild < m_children; ++cChild) { @@ -109,13 +109,13 @@ void Leaf::split(uint32_t dataLength, byte* pData, Region& mbr, id_type id, Node } } -void Leaf::deleteData(id_type id, std::stack& pathBuffer) +void Leaf::deleteData(const Region& mbr, id_type id, std::stack& pathBuffer) { uint32_t child; for (child = 0; child < m_children; ++child) { - if (m_pIdentifier[child] == id) break; + if (m_pIdentifier[child] == id && mbr == *(m_ptrMBR[child])) break; } deleteEntry(child); diff --git a/support/spatialindex/src/rtree/Leaf.h b/support/spatialindex/src/rtree/Leaf.h index 544623e8..f8b11046 100644 --- a/support/spatialindex/src/rtree/Leaf.h +++ b/support/spatialindex/src/rtree/Leaf.h @@ -44,7 +44,7 @@ namespace SpatialIndex virtual void split(uint32_t dataLength, byte* pData, Region& mbr, id_type id, NodePtr& left, NodePtr& right); - virtual void deleteData(id_type id, std::stack& pathBuffer); + virtual void deleteData(const Region& mbr, id_type id, std::stack& pathBuffer); friend class RTree; friend class BulkLoader; diff --git a/support/spatialindex/src/rtree/Makefile.in b/support/spatialindex/src/rtree/Makefile.in deleted file mode 100644 index 5eaa6499..00000000 --- a/support/spatialindex/src/rtree/Makefile.in +++ /dev/null @@ -1,570 +0,0 @@ -# Makefile.in generated by automake 1.13.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2012 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@ -am__make_dryrun = \ - { \ - am__dry=no; \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ - esac; \ - test $$am__dry = yes; \ - } -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@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@ -subdir = src/rtree -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) -librtree_la_LIBADD = -am_librtree_la_OBJECTS = BulkLoader.lo Index.lo Leaf.lo Node.lo \ - RTree.lo Statistics.lo -librtree_la_OBJECTS = $(am_librtree_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_@AM_V@) -am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo " CXX " $@; -am__v_CXX_1 = -CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ - $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) -am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo " CXXLD " $@; -am__v_CXXLD_1 = -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(librtree_la_SOURCES) -DIST_SOURCES = $(librtree_la_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -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@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -noinst_LTLIBRARIES = librtree.la -INCLUDES = -I../../include -librtree_la_SOURCES = BulkLoader.cc Index.cc Leaf.cc Node.cc RTree.cc Statistics.cc BulkLoader.h Index.h Leaf.h Node.h PointerPoolNode.h RTree.h Statistics.h -all: all-am - -.SUFFIXES: -.SUFFIXES: .cc .lo .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 ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/rtree/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/rtree/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 -$(am__aclocal_m4_deps): - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } -librtree.la: $(librtree_la_OBJECTS) $(librtree_la_DEPENDENCIES) $(EXTRA_librtree_la_DEPENDENCIES) - $(AM_V_CXXLD)$(CXXLINK) $(librtree_la_OBJECTS) $(librtree_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BulkLoader.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Index.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Leaf.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Node.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RTree.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Statistics.Plo@am__quote@ - -.cc.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< - -.cc.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cc.lo: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -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 "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$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 $(LTLIBRARIES) -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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libtool clean-noinstLTLIBRARIES \ - 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 - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -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 \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool 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 mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-am 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/support/spatialindex/src/rtree/Node.cc b/support/spatialindex/src/rtree/Node.cc index 40505f84..d4f7ab59 100644 --- a/support/spatialindex/src/rtree/Node.cc +++ b/support/spatialindex/src/rtree/Node.cc @@ -289,7 +289,7 @@ Node::~Node() delete[] m_pIdentifier; } -Node& Node::operator=(const Node& n) +Node& Node::operator=(const Node&) { throw Tools::IllegalStateException("operator =: This should never be called."); } @@ -471,7 +471,7 @@ bool Node::insertData(uint32_t dataLength, byte* pData, Region& mbr, id_type id, id_type cParent = pathBuffer.top(); pathBuffer.pop(); NodePtr ptrN = m_pTree->readNode(cParent); Index* p = static_cast(ptrN.get()); - p->adjustTree(this, pathBuffer); + p->adjustTree(this, pathBuffer, true); for (cIndex = 0; cIndex < lReinsert; ++cIndex) { @@ -589,15 +589,20 @@ void Node::reinsertData(uint32_t dataLength, byte* pData, Region& mbr, id_type i uint32_t cCount; - for (cCount = 0; cCount < cReinsert; ++cCount) + // Keep all but cReinsert nodes + for (cCount = 0; cCount < m_capacity + 1 - cReinsert; ++cCount) { - reinsert.push_back(v[cCount]->m_index); + keep.push_back(v[cCount]->m_index); delete v[cCount]; } - for (cCount = cReinsert; cCount < m_capacity + 1; ++cCount) + // Remove cReinsert nodes which will be + // reinserted into the tree. Since our array + // is already sorted in ascending order this + // matches the order suggested in the paper. + for (cCount = m_capacity + 1 - cReinsert; cCount < m_capacity + 1; ++cCount) { - keep.push_back(v[cCount]->m_index); + reinsert.push_back(v[cCount]->m_index); delete v[cCount]; } @@ -1028,6 +1033,27 @@ void Node::condenseTree(std::stack& toReinsert, std::stack& pa // HACK: pending deleteNode for deleted child will decrease nodesInLevel, later on. m_pTree->m_stats.m_nodesInLevel[m_pTree->m_stats.m_u32TreeHeight - 1] = 2; } + else + { + // due to data removal. + if (m_pTree->m_bTightMBRs) + { + for (uint32_t cDim = 0; cDim < m_nodeMBR.m_dimension; ++cDim) + { + m_nodeMBR.m_pLow[cDim] = std::numeric_limits::max(); + m_nodeMBR.m_pHigh[cDim] = -std::numeric_limits::max(); + + for (uint32_t u32Child = 0; u32Child < m_children; ++u32Child) + { + m_nodeMBR.m_pLow[cDim] = std::min(m_nodeMBR.m_pLow[cDim], m_ptrMBR[u32Child]->m_pLow[cDim]); + m_nodeMBR.m_pHigh[cDim] = std::max(m_nodeMBR.m_pHigh[cDim], m_ptrMBR[u32Child]->m_pHigh[cDim]); + } + } + } + + // write parent node back to storage. + m_pTree->writeNode(this); + } } else { diff --git a/support/spatialindex/src/rtree/RTree.cc b/support/spatialindex/src/rtree/RTree.cc index 50427eec..c86c62fb 100644 --- a/support/spatialindex/src/rtree/RTree.cc +++ b/support/spatialindex/src/rtree/RTree.cc @@ -5,7 +5,7 @@ * Copyright (c) 2002, Marios Hadjieleftheriou * * 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 @@ -689,6 +689,11 @@ void SpatialIndex::RTree::RTree::getIndexProperties(Tools::PropertySet& out) con var.m_varType = Tools::VT_ULONG; var.m_val.ulVal = m_pointPool.getCapacity(); out.setProperty("PointPoolCapacity", var); + + var.m_varType = Tools::VT_LONGLONG; + var.m_val.llVal = m_headerID; + out.setProperty("IndexIdentifier", var); + } void SpatialIndex::RTree::RTree::addCommand(ICommand* pCommand, CommandType ct) @@ -804,6 +809,11 @@ void SpatialIndex::RTree::RTree::getStatistics(IStatistics** out) const *out = new Statistics(m_stats); } +void SpatialIndex::RTree::RTree::flush() +{ + storeHeader(); +} + void SpatialIndex::RTree::RTree::initNew(Tools::PropertySet& ps) { Tools::Variant var; @@ -1255,7 +1265,7 @@ bool SpatialIndex::RTree::RTree::deleteData_impl(const Region& mbr, id_type id) if (l.get() != 0) { Leaf* pL = static_cast(l.get()); - pL->deleteData(id, pathBuffer); + pL->deleteData(mbr, id, pathBuffer); --(m_stats.m_u64Data); return true; } diff --git a/support/spatialindex/src/rtree/RTree.h b/support/spatialindex/src/rtree/RTree.h index 860a43eb..1ad43ddc 100644 --- a/support/spatialindex/src/rtree/RTree.h +++ b/support/spatialindex/src/rtree/RTree.h @@ -80,6 +80,7 @@ namespace SpatialIndex virtual void addCommand(ICommand* pCommand, CommandType ct); virtual bool isIndexValid(); virtual void getStatistics(IStatistics** out) const; + virtual void flush(); private: void initNew(Tools::PropertySet&); diff --git a/support/spatialindex/src/spatialindex/LineSegment.cc b/support/spatialindex/src/spatialindex/LineSegment.cc index 53926ef9..7d2e98c0 100644 --- a/support/spatialindex/src/spatialindex/LineSegment.cc +++ b/support/spatialindex/src/spatialindex/LineSegment.cc @@ -174,12 +174,12 @@ bool LineSegment::intersectsShape(const IShape& s) const ); } -bool LineSegment::containsShape(const IShape& s) const +bool LineSegment::containsShape(const IShape&) const { return false; } -bool LineSegment::touchesShape(const IShape& s) const +bool LineSegment::touchesShape(const IShape&) const { throw Tools::IllegalStateException( "LineSegment::touchesShape: Not implemented yet!" diff --git a/support/spatialindex/src/spatialindex/Makefile.in b/support/spatialindex/src/spatialindex/Makefile.in deleted file mode 100644 index 53f9d204..00000000 --- a/support/spatialindex/src/spatialindex/Makefile.in +++ /dev/null @@ -1,555 +0,0 @@ -# Makefile.in generated by automake 1.13.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2012 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@ -am__make_dryrun = \ - { \ - am__dry=no; \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ - esac; \ - test $$am__dry = yes; \ - } -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@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@ -subdir = src/spatialindex -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) -liblibrary_la_LIBADD = -am_liblibrary_la_OBJECTS = Point.lo Region.lo LineSegment.lo \ - MovingPoint.lo MovingRegion.lo TimePoint.lo TimeRegion.lo \ - SpatialIndexImpl.lo -liblibrary_la_OBJECTS = $(am_liblibrary_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_@AM_V@) -am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo " CXX " $@; -am__v_CXX_1 = -CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ - $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) -am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo " CXXLD " $@; -am__v_CXXLD_1 = -SOURCES = $(liblibrary_la_SOURCES) -DIST_SOURCES = $(liblibrary_la_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -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@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -noinst_LTLIBRARIES = liblibrary.la -INCLUDES = -I../../include -liblibrary_la_SOURCES = Point.cc Region.cc LineSegment.cc MovingPoint.cc MovingRegion.cc TimePoint.cc TimeRegion.cc SpatialIndexImpl.cc -all: all-am - -.SUFFIXES: -.SUFFIXES: .cc .lo .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 ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/spatialindex/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/spatialindex/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 -$(am__aclocal_m4_deps): - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } -liblibrary.la: $(liblibrary_la_OBJECTS) $(liblibrary_la_DEPENDENCIES) $(EXTRA_liblibrary_la_DEPENDENCIES) - $(AM_V_CXXLD)$(CXXLINK) $(liblibrary_la_OBJECTS) $(liblibrary_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LineSegment.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MovingPoint.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MovingRegion.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Point.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Region.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SpatialIndexImpl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimePoint.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimeRegion.Plo@am__quote@ - -.cc.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< - -.cc.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cc.lo: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -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 "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$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 $(LTLIBRARIES) -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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libtool clean-noinstLTLIBRARIES \ - 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 - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -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 \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool 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 mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-am 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/support/spatialindex/src/spatialindex/MovingRegion.cc b/support/spatialindex/src/spatialindex/MovingRegion.cc index 597120e3..21316769 100644 --- a/support/spatialindex/src/spatialindex/MovingRegion.cc +++ b/support/spatialindex/src/spatialindex/MovingRegion.cc @@ -1159,7 +1159,7 @@ double MovingRegion::getIntersectingAreaInTime(const ITimeShape& r) const return getIntersectingAreaInTime(r, r); } -double MovingRegion::getIntersectingAreaInTime(const IInterval& ivI, const ITimeShape& in) const +double MovingRegion::getIntersectingAreaInTime(const IInterval&, const ITimeShape& in) const { const MovingRegion* pr = dynamic_cast(&in); if (pr != 0) return getIntersectingAreaInTime(*pr); diff --git a/support/spatialindex/src/spatialindex/Point.cc b/support/spatialindex/src/spatialindex/Point.cc index 3c1cbc8d..28fe6f9d 100644 --- a/support/spatialindex/src/spatialindex/Point.cc +++ b/support/spatialindex/src/spatialindex/Point.cc @@ -144,7 +144,7 @@ bool Point::intersectsShape(const IShape& s) const ); } -bool Point::containsShape(const IShape& s) const +bool Point::containsShape(const IShape&) const { return false; } diff --git a/support/spatialindex/src/spatialindex/Region.cc b/support/spatialindex/src/spatialindex/Region.cc index cecf9be2..2f294c61 100644 --- a/support/spatialindex/src/spatialindex/Region.cc +++ b/support/spatialindex/src/spatialindex/Region.cc @@ -301,13 +301,13 @@ bool Region::touchesRegion(const Region& r) const for (uint32_t i = 0; i < m_dimension; ++i) { if ( - (m_pLow[i] >= r.m_pLow[i] + std::numeric_limits::epsilon() && - m_pLow[i] <= r.m_pLow[i] - std::numeric_limits::epsilon()) || - (m_pHigh[i] >= r.m_pHigh[i] + std::numeric_limits::epsilon() && - m_pHigh[i] <= r.m_pHigh[i] - std::numeric_limits::epsilon())) - return false; + (m_pLow[i] >= r.m_pLow[i] - std::numeric_limits::epsilon() && + m_pLow[i] <= r.m_pLow[i] + std::numeric_limits::epsilon()) || + (m_pHigh[i] >= r.m_pHigh[i] - std::numeric_limits::epsilon() && + m_pHigh[i] <= r.m_pHigh[i] + std::numeric_limits::epsilon())) + return true; } - return true; + return false; } diff --git a/support/spatialindex/src/spatialindex/TimePoint.cc b/support/spatialindex/src/spatialindex/TimePoint.cc index 9b0b0ec4..921f54d6 100644 --- a/support/spatialindex/src/spatialindex/TimePoint.cc +++ b/support/spatialindex/src/spatialindex/TimePoint.cc @@ -161,27 +161,27 @@ bool TimePoint::intersectsShapeInTime(const ITimeShape& in) const throw Tools::IllegalStateException("intersectsShapeInTime: Not implemented yet!"); } -bool TimePoint::intersectsShapeInTime(const IInterval& ivI, const ITimeShape& in) const +bool TimePoint::intersectsShapeInTime(const IInterval&, const ITimeShape&) const { throw Tools::IllegalStateException("intersectsShapeInTime: Not implemented yet!"); } -bool TimePoint::containsShapeInTime(const ITimeShape& in) const +bool TimePoint::containsShapeInTime(const ITimeShape&) const { return false; } -bool TimePoint::containsShapeInTime(const IInterval& ivI, const ITimeShape& in) const +bool TimePoint::containsShapeInTime(const IInterval&, const ITimeShape&) const { return false; } -bool TimePoint::touchesShapeInTime(const ITimeShape& in) const +bool TimePoint::touchesShapeInTime(const ITimeShape&) const { throw Tools::IllegalStateException("touchesShapeInTime: Not implemented yet!"); } -bool TimePoint::touchesShapeInTime(const IInterval& ivI, const ITimeShape& in) const +bool TimePoint::touchesShapeInTime(const IInterval&, const ITimeShape&) const { throw Tools::IllegalStateException("touchesShapeInTime: Not implemented yet!"); } @@ -191,17 +191,17 @@ double TimePoint::getAreaInTime() const return 0.0; } -double TimePoint::getAreaInTime(const IInterval& ivI) const +double TimePoint::getAreaInTime(const IInterval&) const { return 0.0; } -double TimePoint::getIntersectingAreaInTime(const ITimeShape& r) const +double TimePoint::getIntersectingAreaInTime(const ITimeShape&) const { return 0.0; } -double TimePoint::getIntersectingAreaInTime(const IInterval& ivI, const ITimeShape& r) const +double TimePoint::getIntersectingAreaInTime(const IInterval&, const ITimeShape&) const { return 0.0; } @@ -243,7 +243,7 @@ bool TimePoint::intersectsInterval(const IInterval& ti) const return intersectsInterval(ti.getIntervalType(), ti.getLowerBound(), ti.getUpperBound()); } -bool TimePoint::intersectsInterval(Tools::IntervalType t, const double start, const double end) const +bool TimePoint::intersectsInterval(Tools::IntervalType, const double start, const double end) const { //if (m_startTime != start && // (m_startTime >= end || m_endTime <= start)) return false; diff --git a/support/spatialindex/src/spatialindex/TimeRegion.cc b/support/spatialindex/src/spatialindex/TimeRegion.cc index 1d02d4d6..f3d2ef77 100644 --- a/support/spatialindex/src/spatialindex/TimeRegion.cc +++ b/support/spatialindex/src/spatialindex/TimeRegion.cc @@ -262,7 +262,7 @@ bool TimeRegion::intersectsShapeInTime(const ITimeShape& in) const throw Tools::IllegalStateException("intersectsShapeInTime: Not implemented yet!"); } -bool TimeRegion::intersectsShapeInTime(const IInterval& ivI, const ITimeShape& in) const +bool TimeRegion::intersectsShapeInTime(const IInterval&, const ITimeShape&) const { throw Tools::IllegalStateException("intersectsShapeInTime: Not implemented yet!"); } @@ -278,7 +278,7 @@ bool TimeRegion::containsShapeInTime(const ITimeShape& in) const throw Tools::IllegalStateException("containsShapeInTime: Not implemented yet!"); } -bool TimeRegion::containsShapeInTime(const IInterval& ivI, const ITimeShape& in) const +bool TimeRegion::containsShapeInTime(const IInterval&, const ITimeShape&) const { throw Tools::IllegalStateException("containsShapeInTime: Not implemented yet!"); } @@ -291,7 +291,7 @@ bool TimeRegion::touchesShapeInTime(const ITimeShape& in) const throw Tools::IllegalStateException("touchesShapeInTime: Not implemented yet!"); } -bool TimeRegion::touchesShapeInTime(const IInterval& ivI, const ITimeShape& in) const +bool TimeRegion::touchesShapeInTime(const IInterval&, const ITimeShape&) const { throw Tools::IllegalStateException("touchesShapeInTime: Not implemented yet!"); } @@ -301,17 +301,17 @@ double TimeRegion::getAreaInTime() const throw Tools::IllegalStateException("getAreaInTime: Not implemented yet!"); } -double TimeRegion::getAreaInTime(const IInterval& ivI) const +double TimeRegion::getAreaInTime(const IInterval&) const { throw Tools::IllegalStateException("getAreaInTime: Not implemented yet!"); } -double TimeRegion::getIntersectingAreaInTime(const ITimeShape& r) const +double TimeRegion::getIntersectingAreaInTime(const ITimeShape&) const { throw Tools::IllegalStateException("getIntersectingAreaInTime: Not implemented yet!"); } -double TimeRegion::getIntersectingAreaInTime(const IInterval& ivI, const ITimeShape& r) const +double TimeRegion::getIntersectingAreaInTime(const IInterval&, const ITimeShape&) const { throw Tools::IllegalStateException("getIntersectingAreaInTime: Not implemented yet!"); } @@ -353,7 +353,7 @@ bool TimeRegion::intersectsInterval(const IInterval& ti) const return intersectsInterval(ti.getIntervalType(), ti.getLowerBound(), ti.getUpperBound()); } -bool TimeRegion::intersectsInterval(Tools::IntervalType t, const double start, const double end) const +bool TimeRegion::intersectsInterval(Tools::IntervalType, const double start, const double end) const { //if (m_startTime != start && // (m_startTime >= end || m_endTime <= start)) return false; diff --git a/support/spatialindex/src/storagemanager/DiskStorageManager.cc b/support/spatialindex/src/storagemanager/DiskStorageManager.cc index 70bbdcd0..e38ea117 100644 --- a/support/spatialindex/src/storagemanager/DiskStorageManager.cc +++ b/support/spatialindex/src/storagemanager/DiskStorageManager.cc @@ -31,6 +31,10 @@ // For checking if a file exists - hobu #include +#ifdef WIN32 +#define stat _stat64 +#endif + #include #include "DiskStorageManager.h" #include @@ -43,6 +47,8 @@ bool CheckFilesExists(Tools::PropertySet& ps) bool bExists = false; std::string filename(""); + //std::string idx("idx"); + //std::string dat("dat"); std::string idx("mwx"); std::string dat("mwd"); @@ -127,6 +133,9 @@ DiskStorageManager::DiskStorageManager(Tools::PropertySet& ps) : m_pageSize(0), // Open/Create flag. bool bOverwrite = false; + bool bFileExists = false; + std::streamoff length = 0; + var = ps.getProperty("Overwrite"); if (var.m_varType != Tools::VT_EMPTY) @@ -141,9 +150,12 @@ DiskStorageManager::DiskStorageManager(Tools::PropertySet& ps) : m_pageSize(0), if (var.m_varType != Tools::VT_EMPTY) { - if (var.m_varType != Tools::VT_PCHAR) - throw Tools::IllegalArgumentException("SpatialIndex::DiskStorageManager: Property FileName must be Tools::VT_PCHAR"); + if (!(var.m_varType == Tools::VT_PCHAR || + var.m_varType == Tools::VT_PWCHAR)) + throw Tools::IllegalArgumentException("SpatialIndex::DiskStorageManager: Property FileName must be Tools::VT_PCHAR or Tools::VT_PWCHAR"); + //std::string idx("idx"); + //std::string dat("dat"); std::string idx("mwx"); std::string dat("mwd"); @@ -157,21 +169,23 @@ DiskStorageManager::DiskStorageManager(Tools::PropertySet& ps) : m_pageSize(0), std::string sDataFile = std::string(var.m_val.pcVal) + "." + dat; // check if file exists. - bool bFileExists = CheckFilesExists(ps); + bFileExists = CheckFilesExists(ps); // check if file can be read/written. if (bFileExists == true && bOverwrite == false) { - m_indexFile.open(sIndexFile.c_str(), std::ios::in | std::ios::out | std::ios::binary); - m_dataFile.open(sDataFile.c_str(), std::ios::in | std::ios::out | std::ios::binary); + std::ios_base::openmode mode = std::ios::in | std::ios::out | std::ios::binary; + m_indexFile.open(sIndexFile.c_str(), mode); + m_dataFile.open(sDataFile.c_str(), mode); if (m_indexFile.fail() || m_dataFile.fail()) - throw Tools::IllegalArgumentException("SpatialIndex::DiskStorageManager: Index/Data file cannot be read/writen."); + throw Tools::IllegalArgumentException("SpatialIndex::DiskStorageManager: Index/Data file cannot be read/written."); } else { - m_indexFile.open(sIndexFile.c_str(), std::ios::in | std::ios::out | std::ios::binary | std::ios::trunc); - m_dataFile.open(sDataFile.c_str(), std::ios::in | std::ios::out | std::ios::binary | std::ios::trunc); + std::ios_base::openmode mode = std::ios::in | std::ios::out | std::ios::binary | std::ios::trunc; + m_indexFile.open(sIndexFile.c_str(), mode); + m_dataFile.open(sDataFile.c_str(), mode); if (m_indexFile.fail() || m_dataFile.fail()) throw Tools::IllegalArgumentException("SpatialIndex::DiskStorageManager: Index/Data file cannot be created."); @@ -183,8 +197,13 @@ DiskStorageManager::DiskStorageManager(Tools::PropertySet& ps) : m_pageSize(0), throw Tools::IllegalArgumentException("SpatialIndex::DiskStorageManager: Property FileName was not specified."); } + // get current length of file + m_indexFile.seekg (0, m_indexFile.end); + length = m_indexFile.tellg(); + m_indexFile.seekg (0, m_indexFile.beg); + // find page size. - if (bOverwrite == true) + if ((bOverwrite == true) || (length == 0) || (bFileExists == false)) { var = ps.getProperty("PageSize"); @@ -215,7 +234,7 @@ DiskStorageManager::DiskStorageManager(Tools::PropertySet& ps) : m_pageSize(0), m_buffer = new byte[m_pageSize]; memset(m_buffer, 0, m_pageSize); - if (bOverwrite == false) + if ((bOverwrite == false) && (length > 0)) { uint32_t count; id_type page, id; diff --git a/support/spatialindex/src/storagemanager/DiskStorageManager.h b/support/spatialindex/src/storagemanager/DiskStorageManager.h index 75f4a707..f3471744 100644 --- a/support/spatialindex/src/storagemanager/DiskStorageManager.h +++ b/support/spatialindex/src/storagemanager/DiskStorageManager.h @@ -50,6 +50,7 @@ namespace SpatialIndex std::vector m_pages; }; + protected: std::fstream m_dataFile; std::fstream m_indexFile; uint32_t m_pageSize; diff --git a/support/spatialindex/src/storagemanager/Makefile.in b/support/spatialindex/src/storagemanager/Makefile.in deleted file mode 100644 index a3327adc..00000000 --- a/support/spatialindex/src/storagemanager/Makefile.in +++ /dev/null @@ -1,568 +0,0 @@ -# Makefile.in generated by automake 1.13.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2012 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@ -am__make_dryrun = \ - { \ - am__dry=no; \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ - esac; \ - test $$am__dry = yes; \ - } -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@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@ -subdir = src/storagemanager -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) -libstoragemanager_la_LIBADD = -am_libstoragemanager_la_OBJECTS = Buffer.lo DiskStorageManager.lo \ - MemoryStorageManager.lo RandomEvictionsBuffer.lo -libstoragemanager_la_OBJECTS = $(am_libstoragemanager_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_@AM_V@) -am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo " CXX " $@; -am__v_CXX_1 = -CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ - $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) -am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo " CXXLD " $@; -am__v_CXXLD_1 = -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(libstoragemanager_la_SOURCES) -DIST_SOURCES = $(libstoragemanager_la_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -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@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -noinst_LTLIBRARIES = libstoragemanager.la -INCLUDES = -I../../include -libstoragemanager_la_SOURCES = Buffer.h Buffer.cc DiskStorageManager.cc MemoryStorageManager.cc RandomEvictionsBuffer.cc DiskStorageManager.h MemoryStorageManager.h RandomEvictionsBuffer.h -all: all-am - -.SUFFIXES: -.SUFFIXES: .cc .lo .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 ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/storagemanager/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/storagemanager/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 -$(am__aclocal_m4_deps): - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } -libstoragemanager.la: $(libstoragemanager_la_OBJECTS) $(libstoragemanager_la_DEPENDENCIES) $(EXTRA_libstoragemanager_la_DEPENDENCIES) - $(AM_V_CXXLD)$(CXXLINK) $(libstoragemanager_la_OBJECTS) $(libstoragemanager_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Buffer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DiskStorageManager.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MemoryStorageManager.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RandomEvictionsBuffer.Plo@am__quote@ - -.cc.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< - -.cc.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cc.lo: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -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 "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$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 $(LTLIBRARIES) -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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libtool clean-noinstLTLIBRARIES \ - 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 - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -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 \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool 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 mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-am 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/support/spatialindex/src/storagemanager/MemoryStorageManager.cc b/support/spatialindex/src/storagemanager/MemoryStorageManager.cc index 55f85e56..e6a5ce93 100644 --- a/support/spatialindex/src/storagemanager/MemoryStorageManager.cc +++ b/support/spatialindex/src/storagemanager/MemoryStorageManager.cc @@ -46,7 +46,7 @@ SpatialIndex::IStorageManager* SpatialIndex::StorageManager::createNewMemoryStor return returnMemoryStorageManager(ps); } -MemoryStorageManager::MemoryStorageManager(Tools::PropertySet& ps) +MemoryStorageManager::MemoryStorageManager(Tools::PropertySet&) { } diff --git a/support/spatialindex/src/tools/Makefile.in b/support/spatialindex/src/tools/Makefile.in deleted file mode 100644 index 154627b6..00000000 --- a/support/spatialindex/src/tools/Makefile.in +++ /dev/null @@ -1,550 +0,0 @@ -# Makefile.in generated by automake 1.13.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2012 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@ -am__make_dryrun = \ - { \ - am__dry=no; \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ - esac; \ - test $$am__dry = yes; \ - } -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@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@ -@RAND_IS_CONFIG_FALSE@am__append_1 = rand48.cc -subdir = src/tools -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) -libtools_la_LIBADD = -am__libtools_la_SOURCES_DIST = Tools.cc rand48.cc -@RAND_IS_CONFIG_FALSE@am__objects_1 = rand48.lo -am_libtools_la_OBJECTS = Tools.lo $(am__objects_1) -libtools_la_OBJECTS = $(am_libtools_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_@AM_V@) -am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo " CXX " $@; -am__v_CXX_1 = -CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ - $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) -am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo " CXXLD " $@; -am__v_CXXLD_1 = -SOURCES = $(libtools_la_SOURCES) -DIST_SOURCES = $(am__libtools_la_SOURCES_DIST) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -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@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -noinst_LTLIBRARIES = libtools.la -INCLUDES = -I../../include -libtools_la_SOURCES = Tools.cc $(am__append_1) -all: all-am - -.SUFFIXES: -.SUFFIXES: .cc .lo .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 ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tools/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/tools/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 -$(am__aclocal_m4_deps): - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } -libtools.la: $(libtools_la_OBJECTS) $(libtools_la_DEPENDENCIES) $(EXTRA_libtools_la_DEPENDENCIES) - $(AM_V_CXXLD)$(CXXLINK) $(libtools_la_OBJECTS) $(libtools_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Tools.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rand48.Plo@am__quote@ - -.cc.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< - -.cc.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cc.lo: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -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 "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$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 $(LTLIBRARIES) -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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libtool clean-noinstLTLIBRARIES \ - 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 - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -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 \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool 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 mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-am 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/support/spatialindex/src/tools/Tools.cc b/support/spatialindex/src/tools/Tools.cc index 6957e5ea..315acc9f 100644 --- a/support/spatialindex/src/tools/Tools.cc +++ b/support/spatialindex/src/tools/Tools.cc @@ -348,15 +348,15 @@ void Tools::PropertySet::storeToByteArray(byte** data, uint32_t& length) assert(ptr == (*data) + length); } -Tools::Variant Tools::PropertySet::getProperty(std::string property) +Tools::Variant Tools::PropertySet::getProperty(std::string property) const { - std::map::iterator it = m_propertySet.find(property); + std::map::const_iterator it = m_propertySet.find(property); if (it != m_propertySet.end()) return (*it).second; else return Variant(); } -void Tools::PropertySet::setProperty(std::string property, Variant& v) +void Tools::PropertySet::setProperty(std::string property, Variant const& v) { std::pair::iterator, bool> ret; std::map::iterator it; diff --git a/support/spatialindex/src/tprtree/Leaf.cc b/support/spatialindex/src/tprtree/Leaf.cc index abb76328..2c442964 100644 --- a/support/spatialindex/src/tprtree/Leaf.cc +++ b/support/spatialindex/src/tprtree/Leaf.cc @@ -46,14 +46,14 @@ Leaf::Leaf(SpatialIndex::TPRTree::TPRTree* pTree, id_type id) { } -NodePtr Leaf::chooseSubtree(const MovingRegion& mbr, uint32_t level, std::stack& pathBuffer) +NodePtr Leaf::chooseSubtree(const MovingRegion&, uint32_t, std::stack&) { // should make sure to relinquish other PoolPointer lists that might be pointing to the // same leaf. return NodePtr(this, &(m_pTree->m_leafPool)); } -NodePtr Leaf::findLeaf(const MovingRegion& mbr, id_type id, std::stack& pathBuffer) +NodePtr Leaf::findLeaf(const MovingRegion&, id_type id, std::stack&) { for (uint32_t cChild = 0; cChild < m_children; ++cChild) { diff --git a/support/spatialindex/src/tprtree/Makefile.in b/support/spatialindex/src/tprtree/Makefile.in deleted file mode 100644 index 2a761c4f..00000000 --- a/support/spatialindex/src/tprtree/Makefile.in +++ /dev/null @@ -1,569 +0,0 @@ -# Makefile.in generated by automake 1.13.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2012 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@ -am__make_dryrun = \ - { \ - am__dry=no; \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ - | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ - *) \ - for am__flg in $$MAKEFLAGS; do \ - case $$am__flg in \ - *=*|--*) ;; \ - *n*) am__dry=yes; break;; \ - esac; \ - done;; \ - esac; \ - test $$am__dry = yes; \ - } -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@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@ -subdir = src/tprtree -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) -libtprtree_la_LIBADD = -am_libtprtree_la_OBJECTS = Index.lo Leaf.lo Node.lo TPRTree.lo \ - Statistics.lo -libtprtree_la_OBJECTS = $(am_libtprtree_la_OBJECTS) -AM_V_lt = $(am__v_lt_@AM_V@) -am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) -am__v_lt_0 = --silent -am__v_lt_1 = -AM_V_P = $(am__v_P_@AM_V@) -am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_@AM_V@) -am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_@AM_V@) -am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) -am__v_at_0 = @ -am__v_at_1 = -DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_@AM_V@) -am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) -am__v_CXX_0 = @echo " CXX " $@; -am__v_CXX_1 = -CXXLD = $(CXX) -CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ - $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) -am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) -am__v_CXXLD_0 = @echo " CXXLD " $@; -am__v_CXXLD_1 = -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_@AM_V@) -am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_@AM_V@) -am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(libtprtree_la_SOURCES) -DIST_SOURCES = $(libtprtree_la_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -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@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -noinst_LTLIBRARIES = libtprtree.la -INCLUDES = -I../../include -libtprtree_la_SOURCES = Index.cc Leaf.cc Node.cc TPRTree.cc Statistics.cc Leaf.h Index.h Node.h PointerPoolNode.h Statistics.h TPRTree.h -all: all-am - -.SUFFIXES: -.SUFFIXES: .cc .lo .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 ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tprtree/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/tprtree/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 -$(am__aclocal_m4_deps): - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } -libtprtree.la: $(libtprtree_la_OBJECTS) $(libtprtree_la_DEPENDENCIES) $(EXTRA_libtprtree_la_DEPENDENCIES) - $(AM_V_CXXLD)$(CXXLINK) $(libtprtree_la_OBJECTS) $(libtprtree_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Index.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Leaf.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Node.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Statistics.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TPRTree.Plo@am__quote@ - -.cc.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< - -.cc.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.cc.lo: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: ctags-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -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 "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$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 $(LTLIBRARIES) -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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libtool clean-noinstLTLIBRARIES \ - 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 - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -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 \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool 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 mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-am 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/support/spatialindex/src/tprtree/Node.cc b/support/spatialindex/src/tprtree/Node.cc index 8892f7ef..56bbb9fa 100644 --- a/support/spatialindex/src/tprtree/Node.cc +++ b/support/spatialindex/src/tprtree/Node.cc @@ -322,7 +322,7 @@ Node::~Node() delete[] m_pIdentifier; } -Node& Node::operator=(const Node& n) +Node& Node::operator=(const Node&) { throw Tools::IllegalStateException("Node::operator =: This should never be called."); } diff --git a/support/spatialindex/src/tprtree/TPRTree.cc b/support/spatialindex/src/tprtree/TPRTree.cc index 0de9b332..bc7896a0 100644 --- a/support/spatialindex/src/tprtree/TPRTree.cc +++ b/support/spatialindex/src/tprtree/TPRTree.cc @@ -5,7 +5,7 @@ * Copyright (c) 2002, Marios Hadjieleftheriou * * 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 @@ -355,7 +355,7 @@ void SpatialIndex::TPRTree::TPRTree::pointLocationQuery(const Point& query, IVis rangeQuery(IntersectionQuery, r, v); } -void SpatialIndex::TPRTree::TPRTree::nearestNeighborQuery(uint32_t k, const IShape& query, IVisitor& v, INearestNeighborComparator& nnc) +void SpatialIndex::TPRTree::TPRTree::nearestNeighborQuery(uint32_t, const IShape&, IVisitor&, INearestNeighborComparator&) { throw Tools::IllegalStateException("nearestNeighborQuery: not impelmented yet."); } @@ -367,7 +367,7 @@ void SpatialIndex::TPRTree::TPRTree::nearestNeighborQuery(uint32_t k, const ISha nearestNeighborQuery(k, query, v, nnc); } -void SpatialIndex::TPRTree::TPRTree::selfJoinQuery(const IShape& query, IVisitor& v) +void SpatialIndex::TPRTree::TPRTree::selfJoinQuery(const IShape&, IVisitor&) { throw Tools::IllegalStateException("selfJoinQuery: not impelmented yet."); } @@ -461,6 +461,11 @@ void SpatialIndex::TPRTree::TPRTree::getIndexProperties(Tools::PropertySet& out) var.m_varType = Tools::VT_ULONG; var.m_val.ulVal = m_pointPool.getCapacity(); out.setProperty("PointPoolCapacity", var); + + var.m_varType = Tools::VT_LONGLONG; + var.m_val.llVal = m_headerID; + out.setProperty("IndexIdentifier", var); + } void SpatialIndex::TPRTree::TPRTree::addCommand(ICommand* pCommand, CommandType ct) @@ -588,6 +593,11 @@ void SpatialIndex::TPRTree::TPRTree::getStatistics(IStatistics** out) const *out = new Statistics(m_stats); } +void SpatialIndex::TPRTree::TPRTree::flush() +{ + storeHeader(); +} + void SpatialIndex::TPRTree::TPRTree::initNew(Tools::PropertySet& ps) { Tools::Variant var; diff --git a/support/spatialindex/src/tprtree/TPRTree.h b/support/spatialindex/src/tprtree/TPRTree.h index 188cf3c4..31145b38 100644 --- a/support/spatialindex/src/tprtree/TPRTree.h +++ b/support/spatialindex/src/tprtree/TPRTree.h @@ -79,6 +79,7 @@ namespace SpatialIndex virtual void addCommand(ICommand* pCommand, CommandType ct); virtual bool isIndexValid(); virtual void getStatistics(IStatistics** out) const; + virtual void flush(); private: void initNew(Tools::PropertySet&); diff --git a/unittests/MapWinGISTests/AxMapTests.cs b/unittests/MapWinGISTests/AxMapTests.cs new file mode 100644 index 00000000..4bbf8594 --- /dev/null +++ b/unittests/MapWinGISTests/AxMapTests.cs @@ -0,0 +1,44 @@ +using System; +using AxMapWinGIS; +using MapWinGIS; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace MapWinGISTests +{ + [TestClass] + public class AxMapTests: ICallback + { + private readonly AxMap _axMap1; + private static readonly GlobalSettings _settings = new GlobalSettings(); + + public AxMapTests() + { + _settings.ApplicationCallback = this; + + // Create MapWinGIS: + _axMap1 = Helper.GetAxMap(); + _axMap1.Projection = tkMapProjection.PROJECTION_GOOGLE_MERCATOR; + _axMap1.KnownExtents = tkKnownExtents.keNetherlands; + _axMap1.ZoomBehavior = tkZoomBehavior.zbUseTileLevels; + _axMap1.Tiles.Provider = tkTileProvider.OpenStreetMap; + } + + [TestMethod] + public void GetExtents() + { + Console.WriteLine(_axMap1.Extents.ToDebugString()); + } + + public void Progress(string KeyOfSender, int Percent, string Message) + { + Console.WriteLine($"{Percent} {Message}"); + } + + public void Error(string KeyOfSender, string ErrorMsg) + { + Console.WriteLine("Error: " + ErrorMsg); + } + + + } +} diff --git a/unittests/MapWinGISTests/DrawingTests.cs b/unittests/MapWinGISTests/DrawingTests.cs index 106011b2..05aceed5 100644 --- a/unittests/MapWinGISTests/DrawingTests.cs +++ b/unittests/MapWinGISTests/DrawingTests.cs @@ -12,27 +12,15 @@ namespace MapWinGISTests [TestClass] public class DrawingTests { - private AxMap axMap1; - private Form myForm; + private AxMap _axMap1; [TestInitialize] public void Init() { // Create MapWinGIS: - axMap1 = new AxMap(); - axMap1.CreateControl(); - - // Create form and add MapWinGIS: - myForm = new Form(); - myForm.Controls.Add(axMap1); - - axMap1.Projection = tkMapProjection.PROJECTION_WGS84; - axMap1.KnownExtents = tkKnownExtents.keLatvia; - axMap1.ScalebarVisible = true; - axMap1.ShowCoordinates = tkCoordinatesDisplay.cdmAuto; - axMap1.ShowRedrawTime = true; - axMap1.ShowVersionNumber = true; - axMap1.ShowZoomBar = true; + _axMap1 = Helper.GetAxMap(); + _axMap1.Projection = tkMapProjection.PROJECTION_WGS84; + _axMap1.KnownExtents = tkKnownExtents.keLatvia; CreateLayer(); } @@ -40,55 +28,55 @@ public void Init() [TestMethod] public void DrawCircle() { - axMap1.ClearDrawings(); - var dhandle = axMap1.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList); - axMap1.DrawCircle(24.0, 57.0, 0.1, 0, false); - SaveSnapshot("DrawCircle.jpg"); + _axMap1.ClearDrawings(); + var dhandle = _axMap1.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList); + _axMap1.DrawCircle(24.0, 57.0, 0.1, 0, false); + Helper.SaveSnapshot2(_axMap1, "DrawCircle.jpg"); } [TestMethod] public void DrawCircleEx() { - axMap1.ClearDrawings(); - var dhandle = axMap1.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList); + _axMap1.ClearDrawings(); + var dhandle = _axMap1.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList); var utils = new Utils(); - axMap1.DrawCircleEx(dhandle, 24.0, 57.0, 0.1, utils.ColorByName(tkMapColor.IndianRed), true); - SaveSnapshot("DrawCircleEx.jpg"); + _axMap1.DrawCircleEx(dhandle, 24.0, 57.0, 0.1, utils.ColorByName(tkMapColor.IndianRed), true); + Helper.SaveSnapshot2(_axMap1, "DrawCircleEx.jpg"); } [TestMethod] public void DrawLabel() { - axMap1.ClearDrawings(); - var dhandle = axMap1.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList); - var retVal = axMap1.DrawLabel("label", 24.0, 57.0, 0.0); + _axMap1.ClearDrawings(); + var dhandle = _axMap1.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList); + var retVal = _axMap1.DrawLabel("label", 24.0, 57.0, 0.0); Assert.AreEqual(dhandle, retVal, "Unexpected handle"); - retVal = axMap1.DrawLabel("Воздух", 24.05, 57.05, 0.0); + retVal = _axMap1.DrawLabel("Воздух", 24.05, 57.05, 0.0); Assert.AreEqual(dhandle, retVal, "Unexpected handle"); - SaveSnapshot("DrawLabel.jpg"); + Helper.SaveSnapshot2(_axMap1, "DrawLabel.jpg"); } [TestMethod] public void DrawLabelEx() { - axMap1.ClearDrawings(); - var dhandle = axMap1.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList); - var retVal = axMap1.DrawLabelEx(dhandle, "Воздух", 24.0, 57.0, 45.0); + _axMap1.ClearDrawings(); + var dhandle = _axMap1.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList); + var retVal = _axMap1.DrawLabelEx(dhandle, "Воздух", 24.0, 57.0, 45.0); Assert.AreEqual(dhandle, retVal, "Unexpected handle"); - SaveSnapshot("DrawLabelEx.jpg"); + Helper.SaveSnapshot2(_axMap1, "DrawLabelEx.jpg"); } [TestMethod] public void CheckUnicodeLabelText() { // https://mapwindow.atlassian.net/browse/MWGIS-81 - axMap1.ClearDrawings(); - var dhandle = axMap1.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList); + _axMap1.ClearDrawings(); + var dhandle = _axMap1.NewDrawing(tkDrawReferenceList.dlSpatiallyReferencedList); const string labelText = "Воздух"; const double rotation = 45.0; - var retVal = axMap1.DrawLabelEx(dhandle, labelText, 24.0, 57.0, rotation); + var retVal = _axMap1.DrawLabelEx(dhandle, labelText, 24.0, 57.0, rotation); Assert.AreEqual(dhandle, retVal, "Unexpected handle"); - var labels = axMap1.get_DrawingLabels(dhandle); + var labels = _axMap1.get_DrawingLabels(dhandle); for (var i = 0; i < labels.Count; i++) { var label = labels.Label[i, 0]; @@ -102,37 +90,17 @@ public void CheckUnicodeLabelText() public void SaveSnapshot2() { // MWGIS-80 - SaveSnapshot("SaveSnapshot2.jpg"); - SaveSnapshot("SaveSnapshot2", true); + Helper.SaveSnapshot2(_axMap1, "SaveSnapshot2.jpg"); + Helper.SaveSnapshot2(_axMap1, "SaveSnapshot2", true); } - private void SaveSnapshot(string baseName, bool shouldFail = false) - { - Application.DoEvents(); - var filename = Path.Combine(Path.GetTempPath(), baseName); - if (File.Exists(filename)) File.Delete(filename); - - var img = axMap1.SnapShot2(0, axMap1.CurrentZoom, 1000); - Assert.IsNotNull(img, "Snapshot is null"); - var retVal = img.Save(filename); - if (!shouldFail) - { - Assert.IsTrue(retVal, "Snapshot could not be saved: " + img.ErrorMsg[img.LastErrorCode]); - Assert.IsTrue(File.Exists(filename), "The file doesn't exists."); - DebugMsg(filename); - } - else - { - DebugMsg("Expected error: " + img.ErrorMsg[img.LastErrorCode]); - Assert.IsFalse(retVal, "Image could be saved. This is unexpected."); - } - } + [TestMethod] public void CaptureSnapshot() { // clear map - axMap1.ClearDrawings(); - axMap1.RemoveAllLayers(); + _axMap1.ClearDrawings(); + _axMap1.RemoveAllLayers(); // create layer CreateLayer(); @@ -145,7 +113,7 @@ public void CaptureSnapshot() try { DebugMsg("Calling AxMap.Snapshot() method. Watch for Access Violation Exception if color depth is less than 32 bpp."); - var img = axMap1.SnapShot(axMap1.Extents); + var img = _axMap1.SnapShot(_axMap1.Extents); Assert.IsNotNull(img, "axMap1.SnapShot returned null"); DebugMsg($"Successfully called Snapshot() with color depth = {bpp}."); if (bpp != 32) @@ -180,10 +148,10 @@ private void CreateLayer() Assert.IsTrue(shp.IsValid, "Shape is invalid"); sf.EditAddShape(shp); - axMap1.AddLayer(sf, true); - axMap1.ZoomToShape(0, 0); - axMap1.ZoomOut(0.5); - axMap1.ZoomToTileLevel(axMap1.Tiles.CurrentZoom); + _axMap1.AddLayer(sf, true); + _axMap1.ZoomToShape(0, 0); + _axMap1.ZoomOut(0.5); + _axMap1.ZoomToTileLevel(_axMap1.Tiles.CurrentZoom); } private void DebugMsg(string msg) diff --git a/unittests/MapWinGISTests/GdalUtilsTests.cs b/unittests/MapWinGISTests/GdalUtilsTests.cs index b82595ca..e9c08bb7 100644 --- a/unittests/MapWinGISTests/GdalUtilsTests.cs +++ b/unittests/MapWinGISTests/GdalUtilsTests.cs @@ -37,7 +37,7 @@ public void GdalWarp() }; var retVal = _gdalUtils.GDALWarp(inputFilename, outputFilename, options); WriteLine("retVal: " + retVal); - Assert.IsTrue(retVal, "gdalUtils.GDALWarp() returned false: " + _gdalUtils.ErrorMsg[_gdalUtils.LastErrorCode]); + Assert.IsTrue(retVal, "gdalUtils.GDALWarp() returned false: " + _gdalUtils.ErrorMsg[_gdalUtils.LastErrorCode] + " Detailed error: " + _gdalUtils.DetailedErrorMsg); Assert.IsTrue(File.Exists(outputFilename), "Can't find the output file"); WriteLine(outputFilename + " is created"); } @@ -57,7 +57,7 @@ public void GdalWarp2() "-overwrite" }; var retVal = _gdalUtils.GDALWarp(@"GeoTiff/5band.tif", output, options); - Assert.IsTrue(retVal, "GdalWarp failed: " + _gdalUtils.ErrorMsg[_gdalUtils.LastErrorCode]); + Assert.IsTrue(retVal, "GdalWarp failed: " + _gdalUtils.ErrorMsg[_gdalUtils.LastErrorCode] + " Detailed error: " + _gdalUtils.DetailedErrorMsg); Assert.IsTrue(File.Exists(output), "Output file doesn't exists"); Debug.WriteLine(output); } @@ -138,8 +138,7 @@ public void ClipPolygon() "-cutline", cutline }; retVal = _gdalUtils.GDALWarp(input, output, options); - - Assert.IsTrue(retVal, "Could not ClipGridWithPolygon: " + _gdalUtils.ErrorMsg[_gdalUtils.LastErrorCode]); + Assert.IsTrue(retVal, "Could not ClipGridWithPolygon: " + _gdalUtils.ErrorMsg[_gdalUtils.LastErrorCode] + " Detailed error: " + _gdalUtils.DetailedErrorMsg); Assert.IsTrue(File.Exists(output), "Output file does not exists"); Debug.WriteLine(output); } @@ -158,7 +157,7 @@ public void Shapefile2Gml() }; var retVal = _gdalUtils.GdalVectorTranslate(inputFilename, outputFilename, options, true); - Assert.IsTrue(retVal, "gdalUtils.GdalVectorTranslate() returned false: " + _gdalUtils.ErrorMsg[_gdalUtils.LastErrorCode]); + Assert.IsTrue(retVal, "gdalUtils.GdalVectorTranslate() returned false: " + _gdalUtils.ErrorMsg[_gdalUtils.LastErrorCode] + " Detailed error: " + _gdalUtils.DetailedErrorMsg); Assert.IsTrue(File.Exists(outputFilename), "Can't find the output file"); WriteLine(outputFilename + " is created"); } @@ -215,7 +214,7 @@ public void VeryLargeClip() stopWatch.Stop(); WriteLine("VeryLargeClip took " + stopWatch.Elapsed); - Assert.IsTrue(retVal, "gdalUtils.GdalVectorTranslate() returned false: " + _gdalUtils.ErrorMsg[_gdalUtils.LastErrorCode]); + Assert.IsTrue(retVal, "gdalUtils.GdalVectorTranslate() returned false: " + _gdalUtils.ErrorMsg[_gdalUtils.LastErrorCode] + " Detailed error: " + _gdalUtils.DetailedErrorMsg); Assert.IsTrue(File.Exists(outputFilename), "Can't find the output file"); WriteLine(outputFilename + " is created"); } diff --git a/unittests/MapWinGISTests/Helper.cs b/unittests/MapWinGISTests/Helper.cs index f75aad8a..b10c87fb 100644 --- a/unittests/MapWinGISTests/Helper.cs +++ b/unittests/MapWinGISTests/Helper.cs @@ -1,14 +1,21 @@ using System; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Diagnostics; +using System.Drawing; using System.IO; using System.Threading.Tasks; +using System.Windows.Forms; +using AxMapWinGIS; using MapWinGIS; +using Point = MapWinGIS.Point; namespace MapWinGISTests { public static class Helper { + private static AxMap _axMap1; + public static void PrintExtents(Extents extents) { Console.Write(extents.xMin + "; "); @@ -128,7 +135,7 @@ public static Shapefile CreateSfFromWkt(string wkt, int epsgCode) return sf; } - public static Shapefile OpenShapefile(string fileLocation, bool checkInvalidShapes = true) + public static Shapefile OpenShapefile(string fileLocation, bool checkInvalidShapes = true, ICallback callback = null) { if (!File.Exists(fileLocation)) throw new Exception($"Input file [{fileLocation}] does not exists"); @@ -138,6 +145,8 @@ public static Shapefile OpenShapefile(string fileLocation, bool checkInvalidShap var stopWatch = new Stopwatch(); stopWatch.Start(); var sf = new Shapefile(); + if (callback != null) sf.GlobalCallback = callback; + if (!sf.Open(fileLocation)) throw new Exception("Can't open " + fileLocation + " Error: " + sf.ErrorMsg[sf.LastErrorCode]); stopWatch.Stop(); @@ -187,7 +196,6 @@ public static void CheckValidity(IShapefile sf) public static void DebugMsg(string msg) { Console.WriteLine(msg); - Console.WriteLine(msg); } public static string WorkingFolder(string subfolder) @@ -196,5 +204,120 @@ public static string WorkingFolder(string subfolder) if (!Directory.Exists(tempFolder)) Directory.CreateDirectory(tempFolder); return tempFolder; } + + public static AxMap GetAxMap() + { + if (_axMap1 != null) return _axMap1; + + // Create MapWinGIS: + _axMap1 = new AxMap(); + _axMap1.CreateControl(); + _axMap1.Width = 200; + _axMap1.Height = 200; + + // Create form and add MapWinGIS: + var myForm = new Form(); + myForm.Controls.Add(_axMap1); + + _axMap1.ScalebarVisible = true; + _axMap1.ShowCoordinates = tkCoordinatesDisplay.cdmAuto; + _axMap1.ShowRedrawTime = true; + _axMap1.ShowVersionNumber = true; + _axMap1.ShowZoomBar = true; + _axMap1.CursorMode = tkCursorMode.cmZoomIn; + + return _axMap1; + } + + public static string SaveSnapshot2(AxMap axMap1, string baseName, bool shouldFail = false) + { + Application.DoEvents(); + var filename = Path.Combine(Path.GetTempPath(), baseName); + DeleteFile(filename); + + var img = axMap1.SnapShot2(0, axMap1.CurrentZoom + 10, 1000); + if (img == null) throw new NullReferenceException("Snapshot is null"); + + var retVal = img.Save(filename); + img.Close(); + if (!shouldFail) + { + if (!retVal) throw new Exception("Snapshot could not be saved: " + img.ErrorMsg[img.LastErrorCode]); + if (!File.Exists(filename)) throw new FileNotFoundException("The file doesn't exists.", filename); + DebugMsg(filename); + } + else + { + DebugMsg("Expected error: " + img.ErrorMsg[img.LastErrorCode]); + if (retVal) throw new Exception("Image could be saved. This is unexpected."); + } + + return filename; + } + + public static string SaveSnapshot(AxMap axMap1, string baseName, IExtents boundBox, double extentEnlarger = 1d) + { + Application.DoEvents(); + var filename = Path.Combine(Path.GetTempPath(), baseName); + DeleteFile(filename); + + if ((boundBox.Width * boundBox.Height).Equals(0)) + { + double xmin, ymin, xmax, ymax, zmin, zmax; + boundBox.GetBounds(out xmin, out ymin, out zmin, out xmax, out ymax, out zmax); + boundBox.SetBounds(xmin - extentEnlarger, ymin - extentEnlarger, zmin, xmax + extentEnlarger, ymax + extentEnlarger, zmax); + } + + var img = axMap1.SnapShot(boundBox); + if (img == null) + throw new NullReferenceException("Snapshot is null: " + axMap1.get_ErrorMsg(axMap1.LastErrorCode)); + + var retVal = img.Save(filename); + img.Close(); + img = null; + if (!retVal) throw new Exception("Snapshot could not be saved: " + img.ErrorMsg[img.LastErrorCode]); + if (!File.Exists(filename)) throw new FileNotFoundException("The file doesn't exists.", filename); + DebugMsg(filename); + + return filename; + } + + + ///

+ /// Deletes the file if it exists + /// + /// The filename. + public static void DeleteFile(string filename) + { + if (File.Exists(filename)) + File.Delete(filename); + } + + public static Dictionary GetColorsFromBitmap(string fileLocation) + { + if (!File.Exists(fileLocation)) + throw new Exception($"Input file [{fileLocation}] does not exists"); + + var retVal = new Dictionary(); + using (var bm = new Bitmap(fileLocation)) + { + for (var y = 0; y < bm.Height; y++) + { + for (var x = 0; x < bm.Width; x++) + { + var color = bm.GetPixel(x, y); + if (retVal.ContainsKey(color)) + { + retVal[color]++; + } + else + { + retVal.Add(color, 1); + } + } + } + } + return retVal; + } } } diff --git a/unittests/MapWinGISTests/ImageTests.cs b/unittests/MapWinGISTests/ImageTests.cs index 334f8b28..f5d208c2 100644 --- a/unittests/MapWinGISTests/ImageTests.cs +++ b/unittests/MapWinGISTests/ImageTests.cs @@ -131,5 +131,33 @@ private static Image LoadImageUsingFileManager(string filename) Assert.IsNotNull(img, "Loaded object is not an image"); return img; } + + [TestMethod] + public void SerializeDeserializeImage() + { + // MWGIS-97 + + int size = 2; + Image original = new Image(); + // create 2x2 red square + if (original.CreateNew(size, size)) + { + for (int i = 0; i < size; i++) + for (int j = 0; j < size; j++) + original.Value[i, j] = 0xFF; + } + // serialize it + string s = original.Serialize(true); + + // deserialize it + Image modified = new Image(); + modified.Deserialize(s); + + // verify pixels + Assert.AreEqual(original.Value[0, 0], modified.Value[0, 0]); + Assert.AreEqual(original.Value[0, 1], modified.Value[0, 1]); + Assert.AreEqual(original.Value[1, 0], modified.Value[1, 0]); + Assert.AreEqual(original.Value[1, 1], modified.Value[1, 1]); + } } } diff --git a/unittests/MapWinGISTests/MapWinGISTests.csproj b/unittests/MapWinGISTests/MapWinGISTests.csproj index 281b055c..b6018862 100644 --- a/unittests/MapWinGISTests/MapWinGISTests.csproj +++ b/unittests/MapWinGISTests/MapWinGISTests.csproj @@ -75,6 +75,10 @@ ..\interopCreator\bin\x86\Debug\AxInterop.MapWinGIS.dll False + + ..\packages\JetBrains.dotMemoryUnit.3.0.20171219.105559\lib\net35\dotMemory.Unit.dll + True + ..\interopCreator\bin\x86\Debug\Interop.MapWinGIS.dll False @@ -114,6 +118,8 @@ + + @@ -128,6 +134,7 @@ + PreserveNewest @@ -206,6 +213,18 @@ Always + + Always + + + Always + + + Always + + + Always + PreserveNewest @@ -230,6 +249,18 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -242,6 +273,120 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/unittests/MapWinGISTests/ShapefileTests.cs b/unittests/MapWinGISTests/ShapefileTests.cs index b2acb594..8516d8fb 100644 --- a/unittests/MapWinGISTests/ShapefileTests.cs +++ b/unittests/MapWinGISTests/ShapefileTests.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.IO; using System.Threading; +using AxMapWinGIS; using MapWinGIS; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -11,6 +12,8 @@ namespace MapWinGISTests [DeploymentItem("Testdata")] public class ShapefileTests : ICallback { + private AxMap _axMap1; + [TestInitialize] public void Init() { @@ -134,6 +137,131 @@ public void CreateShapefileTest() } } + [TestMethod] + public void ShapefileDataTest() + { + var tempFolder = Path.GetTempPath(); + var tempFilename = Path.Combine(tempFolder, "ShapefileDataTest.shp"); + var esriShapefilePath = @"C:\dev\MapWinGIS\unittests\MapWinGISTests\Testdata\Issues\MWGIS-48-68\EsriShapefile.shp"; + Helper.DeleteShapefile(tempFilename); + + bool result; + // Create shapefile + var sf = new Shapefile { GlobalCallback = this }; + try + { + result = sf.CreateNewWithShapeID(tempFilename, ShpfileType.SHP_POINT); + Assert.IsTrue(result, "Could not create shapefile"); + + Assert.IsTrue(sf.EditingShapes, "Shapefile is not in edit shapes mode"); + Assert.IsTrue(sf.EditingTable, "Shapefile is not in edit table mode"); + + // Add fields of each data type: + var fieldIndex = sf.EditAddField("intField", FieldType.INTEGER_FIELD, 0, 10); + Assert.AreEqual(1, fieldIndex, "Could not add Integer field"); + var width = sf.Field[fieldIndex].Width; + Assert.AreEqual(9, width, "Integer field did not shrink to 9 digits"); + fieldIndex = sf.EditAddField("dateField", FieldType.DATE_FIELD, 0, 6); + Assert.AreEqual(2, fieldIndex, "Could not add Date field"); + width = sf.Field[fieldIndex].Width; + Assert.AreEqual(8, width, "Date field did not expand to 8 digits"); + fieldIndex = sf.EditAddField("boolField", FieldType.BOOLEAN_FIELD, 0, 3); + Assert.AreEqual(3, fieldIndex, "Could not add Boolean field"); + width = sf.Field[fieldIndex].Width; + Assert.AreEqual(1, width, "Boolean field did not shrink to 1 character"); + // + Assert.AreEqual(fieldIndex + 1, sf.NumFields, "Number of fields are incorrect"); + + result = sf.Save(); + Assert.IsTrue(result, "Could not save shapefile"); + Assert.AreEqual(fieldIndex + 1, sf.NumFields, "Number of fields are incorrect"); + + // Create shape: + var shp = new Shape(); + result = shp.Create(ShpfileType.SHP_POINT); + Assert.IsTrue(result, "Could not create point shape"); + var idx = sf.EditAddShape(shp); + // Add data: + result = sf.EditCellValue(sf.FieldIndexByName["intField"], idx, 99); + Assert.IsTrue(result, "Could not edit intField"); + DateTime dt = System.DateTime.Now; + result = sf.EditCellValue(sf.FieldIndexByName["dateField"], idx, dt); + Assert.IsTrue(result, "Could not edit dateField"); + result = sf.EditCellValue(sf.FieldIndexByName["boolField"], idx, true); + Assert.IsTrue(result, "Could not edit boolField"); + + result = sf.StopEditingShapes(); + Assert.IsTrue(result, "Could not stop editing shapefile"); + + // Read back data: + for (idx = 0; idx < sf.NumShapes; idx++) + { + int iField = (int)sf.CellValue[sf.FieldIndexByName["intField"], idx]; + Assert.AreEqual(iField, 99, "intField value of 99 was not returned"); + DateTime dField = (DateTime)sf.CellValue[sf.FieldIndexByName["dateField"], idx]; + Assert.IsTrue(DateTime.Now.DayOfYear.Equals(((DateTime)dField).DayOfYear), "dateField value of Now was not returned"); + bool bField = (bool)sf.CellValue[sf.FieldIndexByName["boolField"], idx]; + Assert.AreEqual(bField, true, "boolField value of True was not returned"); + } + } + finally + { + // Close the shapefile: + result = sf.Close(); + Assert.IsTrue(result, "Could not close shapefile"); + } + + // although the default setting, indicate intent to interpret Y/N OGR String fields as Boolean + GlobalSettings gs = new GlobalSettings(); + gs.OgrInterpretYNStringAsBoolean = true; // setting to false results in exception reading boolField below + + // open as OGRLayer + OgrDatasource _datasource = new OgrDatasource(); + _datasource.GlobalCallback = this; + + if (_datasource.Open(tempFilename)) // "ESRI Shapefile:" + + { + // read layer through OGR library + IOgrLayer ogrLayer = _datasource.GetLayer(0); + sf = ogrLayer.GetBuffer(); + for (int idx = 0; idx < sf.NumShapes; idx++) + { + int iField = (int)sf.CellValue[sf.FieldIndexByName["intField"], idx]; + Assert.AreEqual(iField, 99, "intField value of 99 was not returned"); + DateTime dField = (DateTime)sf.CellValue[sf.FieldIndexByName["dateField"], idx]; + Assert.IsTrue(DateTime.Now.DayOfYear.Equals(((DateTime)dField).DayOfYear), "dateField value of Now was not returned"); + bool bField = (bool)sf.CellValue[sf.FieldIndexByName["boolField"], idx]; + Assert.AreEqual(bField, true, "boolField value of True was not returned"); + } + sf.Close(); + } + + // open and read a Shapefile created by ESRI MapObjects, including a Boolean and Date field + // table has a Boolean 'Inspected' field, and a Date 'InspDate' field + Assert.IsTrue(sf.Open(esriShapefilePath, this)); + for (int fld = 0; fld < sf.NumFields; fld++) + { + Console.WriteLine(string.Format("Field({0}): Name = '{1}', Fieldtype = {2}", fld, sf.Field[fld].Name, sf.Field[fld].Type)); + } + for (int idx = 0; idx < sf.NumShapes; idx++) + { + // read 'Inspected' value as object + object inspected = sf.CellValue[sf.FieldIndexByName["Inspected"], idx]; + // verify that it's a bool + Assert.IsTrue(inspected is bool); + // watch for Inspected rows (there aren't many) + if ((bool)inspected == true) + { + // read 'InspDate' value as object + object dt = sf.CellValue[sf.FieldIndexByName["InspDate"], idx]; + // verify that it's a Date + Assert.IsTrue(dt is DateTime); + Console.WriteLine(string.Format("idx = {0}, Inspected = true, Inspection Date = {1}", idx, (DateTime)dt)); + } + } + sf.Close(); + } + /// /// Checks the null value table data. /// @@ -522,7 +650,301 @@ public void PointInShapefile() stopWatch.Stop(); Console.WriteLine("The process took " + stopWatch.Elapsed); Console.WriteLine(found + " matching polygons where found"); + } + + [TestMethod] + public void SpatialIndexMWGIS98() + { + const string sfName = @"Issues\MWGIS-98\3dPoint.shp"; + GetInfoShapefile(sfName); + TestSpatialIndex(sfName); + } + + [TestMethod] + public void SpatialIndexAllTypes() + { + var numErrors = 0; + foreach (var filename in Directory.EnumerateFiles(@"sf", "*.shp", SearchOption.AllDirectories)) + { + try + { + Console.WriteLine("***************************"); + GetInfoShapefile(filename); + TestSpatialIndex(filename); + Console.WriteLine("Test was successful"); + Console.WriteLine(); + } + catch (Exception e) + { + numErrors++; + Console.WriteLine(e); + // Don't stop + } + } + + Assert.AreEqual(0, numErrors); + Console.ReadLine(); + } + + private void TestSpatialIndex(string sfName) + { + // Delete previous spatial index files: + Helper.DeleteFile(Path.ChangeExtension(sfName, ".mwd")); + Helper.DeleteFile(Path.ChangeExtension(sfName, ".mwx")); + + var sf = Helper.OpenShapefile(sfName, true, this); + bool retVal; + var baseName = Path.GetFileNameWithoutExtension(sfName); + try + { + Console.WriteLine("Numshapes: " + sf.NumShapes); + + // Get map to create snapshot: + _axMap1 = Helper.GetAxMap(); + _axMap1.TileProvider = tkTileProvider.ProviderNone; + _axMap1.ZoomBehavior = tkZoomBehavior.zbDefault; + _axMap1.KnownExtents = tkKnownExtents.keWorld; + + var layerHandle = _axMap1.AddLayer(sf, true); + Assert.IsTrue(layerHandle > -1, "Can't add layer"); + _axMap1.ZoomToLayer(layerHandle); + var snapshot = Helper.SaveSnapshot(_axMap1, $"{baseName}-without.jpg", _axMap1.get_layerExtents(layerHandle), 1); + var colorsWithout = Helper.GetColorsFromBitmap(snapshot); + Assert.IsTrue(colorsWithout.Count > 1, "No colors found. Most likely the points are not loaded on the map."); + Console.WriteLine("Number of unique colors without index: " + colorsWithout.Count); + // Zoom in: + _axMap1.ZoomIn(0.3); + snapshot = Helper.SaveSnapshot(_axMap1, $"{baseName}-without-zoomin.jpg", _axMap1.get_layerExtents(layerHandle), 2); + var colorsWithoutZoomIn = Helper.GetColorsFromBitmap(snapshot); + Assert.IsTrue(colorsWithoutZoomIn.Count > 1, "No colors found. Most likely the points are not loaded on the map."); + Console.WriteLine("Number of unique colors without index zoom in: " + colorsWithoutZoomIn.Count); + + // Create spatial index: + retVal = sf.CreateSpatialIndex(sfName); + Assert.IsTrue(retVal, "Can't create spatial index: " + sf.ErrorMsg[sf.LastErrorCode]); + Assert.IsTrue(sf.IsSpatialIndexValid(), "Spatial index is invalid"); + sf.UseSpatialIndex = true; + _axMap1.ZoomToLayer(layerHandle); + snapshot = Helper.SaveSnapshot(_axMap1, $"{baseName}-with.jpg", _axMap1.get_layerExtents(layerHandle), 1); + var colorsWith = Helper.GetColorsFromBitmap(snapshot); + Assert.IsTrue(colorsWith.Count > 1, "No colors found. Most likely the points are not loaded on the map."); + Console.WriteLine("Number of unique colors with index: " + colorsWith.Count); + + // Zoom in: + _axMap1.ZoomIn(0.3); + snapshot = Helper.SaveSnapshot(_axMap1, $"{baseName}-with-zoomin.jpg", _axMap1.get_layerExtents(layerHandle), 2); + var colorsWithZoomIn = Helper.GetColorsFromBitmap(snapshot); + Console.WriteLine("Number of unique colors with index zoom in: " + colorsWithZoomIn.Count); + + Assert.AreEqual(colorsWith.Count, colorsWithout.Count, "The snapshots no zoom are not identical"); + Assert.AreEqual(colorsWithZoomIn.Count, colorsWithoutZoomIn.Count, "The snapshots zoom in are not identical"); + } + finally + { + retVal = sf.Close(); + Assert.IsTrue(retVal, "Can't close shapefile"); + } + } + + [TestMethod] + public void GetInfoAllShapefiles() + { + // Call EnumerateFiles in a foreach-loop. + foreach (var filename in Directory.EnumerateFiles(@"D:\dev\MapwinGIS\GitHub\unittests\MapWinGISTests\Testdata\sf", "*.shp", SearchOption.AllDirectories)) + { + try + { + Console.WriteLine("***************************"); + GetInfoShapefile(filename); + Console.WriteLine(); + } + catch (Exception e) + { + Console.WriteLine(e); + // Don't stop + } + } + } + + [TestMethod] + public void PointM() + { + const string filename = @"d:\dev\GIS-Data\Issues\MWGIS-69 Merge M\shp1_point_m\SHP1_POINT_M.shp"; + var retVal = GetInfoShapefile(filename); + Assert.IsTrue(retVal); + } + + [TestMethod] + public void UpdatePolygonZ() + { + const string filename = @"D:\dev\GIS-Data\Issues\CORE-198-crash on view properties\ND_-_Export.shp"; + var retVal = GetInfoShapefile(filename); + Assert.IsTrue(retVal); + + // Update Z Value: + var sf = new Shapefile { GlobalCallback = this }; + if (!sf.Open(filename)) + throw new Exception("Cannot open this file: " + sf.ErrorMsg[sf.LastErrorCode]); + + // Go into edit mode: + if (!sf.StartEditingShapes()) + throw new Exception("Cannot StartEditingShapes: " + sf.ErrorMsg[sf.LastErrorCode]); + + var shp = sf.Shape[0]; + var numPoints = shp.numPoints; + for (var i = 0; i < numPoints; i++) + { + // Add the index as Z value + shp.put_Z(i, i + 10); + } + + // Save and close shapefile: + if (!sf.StopEditingShapes()) + throw new Exception("Cannot StopEditingShapes: " + sf.ErrorMsg[sf.LastErrorCode]); + if (!sf.Close()) + throw new Exception("Cannot close shapefile: " + sf.ErrorMsg[sf.LastErrorCode]); + + retVal = GetInfoShapefile(filename); + Assert.IsTrue(retVal); + + } + + private bool GetInfoShapefile(string filename) + { + if (!File.Exists(filename)) + throw new FileNotFoundException("Cannot find file", filename); + + Console.WriteLine("Working with " + filename); + var sf = new Shapefile { GlobalCallback = this }; + bool retVal; + + try + { + if (!sf.Open(filename)) + throw new Exception("Cannot open this file: " + sf.ErrorMsg[sf.LastErrorCode]); + + Console.WriteLine("ShapefileType: " + sf.ShapefileType); + Console.WriteLine("ShapefileType2D: " + sf.ShapefileType2D); + Console.WriteLine("Num fields: " + sf.NumFields); + Console.WriteLine("Num shapes: " + sf.NumShapes); + Console.WriteLine("HasSpatialIndex: " + sf.HasSpatialIndex); + Console.WriteLine("Projection: " + sf.Projection); + if (sf.NumShapes < 100) + { + Console.WriteLine("HasInvalidShapes: " + sf.HasInvalidShapes()); + } + else + { + Console.WriteLine("Warning. Large number of shapes. Skipping HasInvalidShapes check."); + } + + if (!sf.GeoProjection.IsEmpty) + { + int epsgCode; + sf.GeoProjection.TryAutoDetectEpsg(out epsgCode); + Console.WriteLine("epsgCode: " + epsgCode); + } + + if (sf.NumShapes <= 0) + throw new Exception("Shapefile has no shapes"); + + var shp = sf.Shape[0]; + if (shp == null) + throw new NullReferenceException("Cannot get shape: " + sf.ErrorMsg[sf.LastErrorCode]); + + Console.WriteLine("numPoints: " + shp.numPoints); + Console.WriteLine("NumParts: " + shp.NumParts); + Console.WriteLine("ShapeType: " + shp.ShapeType); + Console.WriteLine("ShapeType2D: " + shp.ShapeType2D); + var isValid = shp.IsValid; + Console.WriteLine("IsValid: " + isValid); + if (!isValid) + { + Console.WriteLine("IsValidReason: " + shp.IsValidReason); + } + + if (sf.ShapefileType != shp.ShapeType) + Console.WriteLine("Warning shape(file) type mismatch"); + + double x = 0d, y = 0d; + double z, m; + if (!shp.XY[0, ref x, ref y]) + throw new Exception("Cannot get XY from shape: " + shp.ErrorMsg[shp.LastErrorCode]); + Console.WriteLine("X: " + x); + Console.WriteLine("Y: " + y); + + switch (shp.ShapeType) + { + case ShpfileType.SHP_NULLSHAPE: + throw new Exception("Shape is a NULLSHAPE"); + case ShpfileType.SHP_POINT: + break; + case ShpfileType.SHP_POLYLINE: + Console.WriteLine("Length: " + shp.Length); + break; + case ShpfileType.SHP_POLYGON: + Console.WriteLine("Area: " + shp.Area); + Console.WriteLine("Perimeter: " + shp.Perimeter); + break; + case ShpfileType.SHP_MULTIPOINT: + break; + case ShpfileType.SHP_POINTZ: + if (!shp.get_Z(0, out z)) + throw new Exception("Cannot get Z from shape: " + shp.ErrorMsg[shp.LastErrorCode]); + Console.WriteLine("Z: " + z); + break; + case ShpfileType.SHP_POLYLINEZ: + if (!shp.get_Z(0, out z)) + throw new Exception("Cannot get Z from shape: " + shp.ErrorMsg[shp.LastErrorCode]); + Console.WriteLine("Z: " + z); + Console.WriteLine("Length: " + shp.Length); + break; + case ShpfileType.SHP_POLYGONZ: + if (!shp.get_Z(0, out z)) + throw new Exception("Cannot get Z from shape: " + shp.ErrorMsg[shp.LastErrorCode]); + Console.WriteLine("Z: " + z); + Console.WriteLine("Area: " + shp.Area); + Console.WriteLine("Perimeter: " + shp.Perimeter); + break; + case ShpfileType.SHP_MULTIPOINTZ: + break; + case ShpfileType.SHP_POINTM: + if (!shp.get_M(0, out m)) + throw new Exception("Cannot get M from shape: " + shp.ErrorMsg[shp.LastErrorCode]); + Console.WriteLine("M: " + m); + break; + case ShpfileType.SHP_POLYLINEM: + if (!shp.get_M(0, out m)) + throw new Exception("Cannot get M from shape: " + shp.ErrorMsg[shp.LastErrorCode]); + Console.WriteLine("M: " + m); + Console.WriteLine("Length: " + shp.Length); + break; + case ShpfileType.SHP_POLYGONM: + if (!shp.get_M(0, out m)) + throw new Exception("Cannot get M from shape: " + shp.ErrorMsg[shp.LastErrorCode]); + Console.WriteLine("M: " + m); + Console.WriteLine("Area: " + shp.Area); + Console.WriteLine("Perimeter: " + shp.Perimeter); + break; + case ShpfileType.SHP_MULTIPOINTM: + if (!shp.get_M(0, out m)) + throw new Exception("Cannot get M from shape: " + shp.ErrorMsg[shp.LastErrorCode]); + Console.WriteLine("M: " + m); + break; + case ShpfileType.SHP_MULTIPATCH: + break; + default: + throw new ArgumentOutOfRangeException(); + } + + retVal = true; + } + finally + { + sf.Close(); + } + return retVal; } public void Progress(string KeyOfSender, int Percent, string Message) diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.dbf b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.dbf new file mode 100644 index 00000000..2da0a685 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.sbn b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.sbn new file mode 100644 index 00000000..47796c38 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.sbn differ diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.sbx b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.sbx new file mode 100644 index 00000000..557ea5a2 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.sbx differ diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.shp b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.shp new file mode 100644 index 00000000..21e20d14 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.shp differ diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.shx b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.shx new file mode 100644 index 00000000..2dc5badb Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-48-68/EsriShapefile.shx differ diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.dbf b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.dbf new file mode 100644 index 00000000..deffde01 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.prj b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.prj new file mode 100644 index 00000000..b13a7179 --- /dev/null +++ b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.shp b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.shp new file mode 100644 index 00000000..58f05ba4 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.shp differ diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.shx b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.shx new file mode 100644 index 00000000..b2dc0c86 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/2dPoint.shx differ diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.dbf b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.dbf new file mode 100644 index 00000000..bb274cf1 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.prj b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.prj new file mode 100644 index 00000000..f45cbadf --- /dev/null +++ b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.shp b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.shp new file mode 100644 index 00000000..be320c8c Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.shp differ diff --git a/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.shx b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.shx new file mode 100644 index 00000000..d823812a Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/Issues/MWGIS-98/3dPoint.shx differ diff --git a/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.dbf b/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.dbf new file mode 100644 index 00000000..bb274cf1 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.prj b/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.prj new file mode 100644 index 00000000..f45cbadf --- /dev/null +++ b/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.shp b/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.shp new file mode 100644 index 00000000..be320c8c Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.shp differ diff --git a/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.shx b/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.shx new file mode 100644 index 00000000..d823812a Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/MWGIS-98.shx differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.dbf b/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.dbf new file mode 100644 index 00000000..dde84681 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.prj b/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.prj new file mode 100644 index 00000000..b13a7179 --- /dev/null +++ b/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.shp b/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.shp new file mode 100644 index 00000000..f4cd5b27 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.shp differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.shx b/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.shx new file mode 100644 index 00000000..bd2fa5b2 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_MULTIPOINT.shx differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.dbf b/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.dbf new file mode 100644 index 00000000..94e316fd Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.prj b/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.prj new file mode 100644 index 00000000..da98376f --- /dev/null +++ b/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.prj @@ -0,0 +1 @@ +PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]] \ No newline at end of file diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.shp b/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.shp new file mode 100644 index 00000000..d82c3efe Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.shp differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.shx b/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.shx new file mode 100644 index 00000000..62c1e6fc Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POINT.shx differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.dbf b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.dbf new file mode 100644 index 00000000..c8d3411c Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.prj b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.prj new file mode 100644 index 00000000..f45cbadf --- /dev/null +++ b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.shp b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.shp new file mode 100644 index 00000000..47161ed9 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.shp differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.shx b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.shx new file mode 100644 index 00000000..039905be Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTM.shx differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POINTZ.dbf b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTZ.dbf new file mode 100644 index 00000000..a9783b08 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTZ.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POINTZ.shp b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTZ.shp new file mode 100644 index 00000000..5f8aa70d Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTZ.shp differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POINTZ.shx b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTZ.shx new file mode 100644 index 00000000..a78ec74c Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POINTZ.shx differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.dbf b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.dbf new file mode 100644 index 00000000..52b04814 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.prj b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.prj new file mode 100644 index 00000000..a30c00a5 --- /dev/null +++ b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.shp b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.shp new file mode 100644 index 00000000..7d96e669 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.shp differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.shx b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.shx new file mode 100644 index 00000000..e82e6a49 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGON.shx differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.dbf b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.dbf new file mode 100644 index 00000000..bf4a7bb9 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.prj b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.prj new file mode 100644 index 00000000..31a40884 --- /dev/null +++ b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.prj @@ -0,0 +1 @@ +GEOGCS["GRS 1980(IUGG, 1980)",DATUM["D_unknown",SPHEROID["GRS80",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.shp b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.shp new file mode 100644 index 00000000..8cc33149 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.shp differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.shx b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.shx new file mode 100644 index 00000000..598820d5 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONM.shx differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.dbf b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.dbf new file mode 100644 index 00000000..bdb56303 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.prj b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.prj new file mode 100644 index 00000000..60bfa862 --- /dev/null +++ b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.prj @@ -0,0 +1 @@ +GEOGCS["WGS 84", DATUM["World Geodetic System 1984", SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], AXIS["Geodetic latitude", NORTH], AUTHORITY["EPSG","4326"]] \ No newline at end of file diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.shp b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.shp new file mode 100644 index 00000000..98323cf3 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.shp differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.shx b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.shx new file mode 100644 index 00000000..47e02355 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYGONZ.shx differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINE.dbf b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINE.dbf new file mode 100644 index 00000000..f10d8204 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINE.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINE.shp b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINE.shp new file mode 100644 index 00000000..b07339f4 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINE.shp differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINE.shx b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINE.shx new file mode 100644 index 00000000..128b961e Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINE.shx differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.dbf b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.dbf new file mode 100644 index 00000000..09ce0074 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.prj b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.prj new file mode 100644 index 00000000..5adb2a91 --- /dev/null +++ b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.prj @@ -0,0 +1 @@ +PROJCS["RGF93_Lambert_93",GEOGCS["GCS_RGF93",DATUM["D_RGF_1993",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["standard_parallel_1",49],PARAMETER["standard_parallel_2",44],PARAMETER["latitude_of_origin",46.5],PARAMETER["central_meridian",3],PARAMETER["false_easting",700000],PARAMETER["false_northing",6600000],UNIT["Meter",1]] \ No newline at end of file diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.shp b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.shp new file mode 100644 index 00000000..b624ea4c Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.shp differ diff --git a/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.shx b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.shx new file mode 100644 index 00000000..8ed80049 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/SHP_POLYLINEZ.shx differ diff --git a/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.dbf b/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.dbf new file mode 100644 index 00000000..07e61349 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.dbf differ diff --git a/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.prj b/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.prj new file mode 100644 index 00000000..ade01a51 --- /dev/null +++ b/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.prj @@ -0,0 +1 @@ +PROJCS["NAD_1983_UTM_Zone_15N",GEOGCS["GCS_North_American_1983",DATUM["D_NORTH_AMERICAN_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-93],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]],VERTCS["Local",VDATUM["Local"],PARAMETER["Direction",1.0],UNIT["Meter",1.0]] diff --git a/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.shp b/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.shp new file mode 100644 index 00000000..9e82d571 Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.shp differ diff --git a/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.shx b/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.shx new file mode 100644 index 00000000..0a735f6f Binary files /dev/null and b/unittests/MapWinGISTests/Testdata/sf/TypeMismatch.shx differ diff --git a/unittests/MapWinGISTests/TilesTests.cs b/unittests/MapWinGISTests/TilesTests.cs new file mode 100644 index 00000000..663fc902 --- /dev/null +++ b/unittests/MapWinGISTests/TilesTests.cs @@ -0,0 +1,75 @@ +using System; +using System.IO; +using AxMapWinGIS; +using MapWinGIS; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace MapWinGISTests +{ + [TestClass] + public class TilesTests : ICallback, IStopExecution + { + private readonly AxMap _axMap1; + private static readonly GlobalSettings _settings = new GlobalSettings(); + + public TilesTests() + { + _settings.ApplicationCallback = this; + + // Create MapWinGIS: + _axMap1 = Helper.GetAxMap(); + _axMap1.Projection = tkMapProjection.PROJECTION_GOOGLE_MERCATOR; + _axMap1.KnownExtents = tkKnownExtents.keNetherlands; + _axMap1.ZoomBehavior = tkZoomBehavior.zbUseTileLevels; + _axMap1.Tiles.Provider = tkTileProvider.OpenStreetMap; + + // Tiles settings: + _axMap1.Tiles.GlobalCallback = this; + _settings.StartLogTileRequests(@"D:\tmp\axmap.tiles\TileRequests.log"); + } + + ~TilesTests() + { + _settings.StopLogTileRequests(); + } + + [TestMethod] + public void ShowProviderDetails() + { + Console.WriteLine($"Provider {_axMap1.Tiles.Provider.ToString()} supports zoom levels from {_axMap1.Tiles.MinZoom} to {_axMap1.Tiles.MaxZoom}"); + Console.WriteLine( + $"DiskCacheFilename: {_axMap1.Tiles.DiskCacheFilename} Cache to disk: {_axMap1.Tiles.DoCaching[tkCacheType.Disk]} Cache to memory: {_axMap1.Tiles.DoCaching[tkCacheType.RAM]}"); + Console.WriteLine($"ProjectionStatus: {_axMap1.Tiles.ProjectionStatus.ToString()}"); + } + + [TestMethod] + public void PrefetchToFolder() + { + Console.WriteLine("Tiles projection status: " + _axMap1.Tiles.ProjectionStatus); + Console.WriteLine("_axMap1.Extents: " + _axMap1.Extents.ToDebugString()); + + var outputFolder = $@"D:\tmp\axmap.tiles\{_axMap1.Tiles.Provider.ToString()}"; + if (!Directory.Exists(outputFolder)) Directory.CreateDirectory(outputFolder); + + var numTilesToCache = _axMap1.Tiles.PrefetchToFolder(_axMap1.Extents, 5, + Convert.ToInt32(tkTileProvider.OpenStreetMap), outputFolder, ".png", this); + Console.WriteLine("numTilesToCache: " + numTilesToCache); + } + + + public void Progress(string KeyOfSender, int Percent, string Message) + { + Console.WriteLine($"{Percent} {Message}"); + } + + public void Error(string KeyOfSender, string ErrorMsg) + { + Console.WriteLine("Error: " + ErrorMsg); + } + + public bool StopFunction() + { + return false; + } + } +} diff --git a/unittests/MapWinGISTests/UtilTests.cs b/unittests/MapWinGISTests/UtilTests.cs index f6e6201e..f49a223c 100644 --- a/unittests/MapWinGISTests/UtilTests.cs +++ b/unittests/MapWinGISTests/UtilTests.cs @@ -278,6 +278,18 @@ public void ProjectionStrings() importProjection = gp.Name; Assert.AreEqual(utilProjection, importProjection); + // get ESRI-specific NAD83 name + utilProjection = utils.GetNAD83ProjectionName(tkNad83Projection.NAD_1983_StatePlane_Alabama_East_FIPS_0101_Feet); + gp.ImportFromEPSG((int)tkNad83Projection.NAD_1983_StatePlane_Alabama_East_FIPS_0101_Feet); + importProjection = gp.Name; + Assert.AreEqual(utilProjection, importProjection); + + // get ESRI-specific WGS84 name + utilProjection = utils.GetWGS84ProjectionName(tkWgs84Projection.WGS_1984_Web_Mercator); + gp.ImportFromEPSG((int)tkWgs84Projection.WGS_1984_Web_Mercator); + importProjection = gp.Name; + Assert.AreEqual(utilProjection, importProjection); + // get NAD83 name by ID utilProjection = utils.GetProjectionNameByID((int)tkNad83Projection.Nad83_Alabama_East); gp.ImportFromEPSG((int)tkNad83Projection.Nad83_Alabama_East); @@ -290,6 +302,18 @@ public void ProjectionStrings() importProjection = gp.Name; Assert.AreEqual(utilProjection, importProjection); + // get ESRI-specific NAD83 name by ID + utilProjection = utils.GetProjectionNameByID((int)tkNad83Projection.NAD_1983_StatePlane_Alabama_East_FIPS_0101_Feet); + gp.ImportFromEPSG((int)tkNad83Projection.NAD_1983_StatePlane_Alabama_East_FIPS_0101_Feet); + importProjection = gp.Name; + Assert.AreEqual(utilProjection, importProjection); + + // get ESRI-specific WGS84 name by ID + utilProjection = utils.GetProjectionNameByID((int)tkWgs84Projection.WGS_1984_Web_Mercator); + gp.ImportFromEPSG((int)tkWgs84Projection.WGS_1984_Web_Mercator); + importProjection = gp.Name; + Assert.AreEqual(utilProjection, importProjection); + // get obscure names by ID utilProjection = utils.GetProjectionNameByID(2402); gp.ImportFromEPSG(2402); diff --git a/unittests/TestExecutor/Program.cs b/unittests/TestExecutor/Program.cs index 589f2c52..3f517d50 100644 --- a/unittests/TestExecutor/Program.cs +++ b/unittests/TestExecutor/Program.cs @@ -44,18 +44,22 @@ public static void Main(string[] args) //t.ReadAttributesFromPostGISLayer(); //var t = new ShapefileTests(); + //t.ShapefileDataTest(); + //t.Reproject2280Test(); //t.ReadRussionDataFromTable(); //t.CreateRussionCategories(); //t.MergeM(); //t.Reproject2280Test(); // t.PointInShapefile(); + // t.SpatialIndexMWGIS98(); //var t = new GridTests(); //t.ChangeValueGridNotInRam(); - //var t = new ImageTests(); + // var t = new ImageTests(); //t.SaveImageShouldFail(); + //t.SerializeDeserializeImage(); //var t = new DrawingTests(); //t.Init(); @@ -67,11 +71,14 @@ public static void Main(string[] args) //t.DissolveLargefileClipper(); var t = new UtilTests(); + t.ProjectionStrings(); //t.ZonalStatistics(); //t.ReclassifyRaster(); //t.ClipPolygon(); - t.PointInPolygon(); + //t.PointInPolygon(); + //var t = new TilesTests(); + //t.PrefetchToFolder(); Console.WriteLine("Finished"); Console.ReadLine(); diff --git a/unittests/interopCreator/Form1.Designer.cs b/unittests/interopCreator/Form1.Designer.cs index 8635223b..4adf2f35 100644 --- a/unittests/interopCreator/Form1.Designer.cs +++ b/unittests/interopCreator/Form1.Designer.cs @@ -42,15 +42,17 @@ private void InitializeComponent() this.button6 = new System.Windows.Forms.Button(); this.button7 = new System.Windows.Forms.Button(); this.button8 = new System.Windows.Forms.Button(); - this.axMap1 = new AxMapWinGIS.AxMap(); this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.axMap1 = new AxMapWinGIS.AxMap(); ((System.ComponentModel.ISupportInitialize)(this.axMap1)).BeginInit(); this.SuspendLayout(); // // button1 // this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button1.Location = new System.Drawing.Point(660, 12); + this.button1.Location = new System.Drawing.Point(686, 12); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(136, 23); this.button1.TabIndex = 1; @@ -61,7 +63,7 @@ private void InitializeComponent() // button2 // this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button2.Location = new System.Drawing.Point(660, 42); + this.button2.Location = new System.Drawing.Point(686, 42); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(136, 23); this.button2.TabIndex = 2; @@ -72,7 +74,7 @@ private void InitializeComponent() // button3 // this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button3.Location = new System.Drawing.Point(660, 72); + this.button3.Location = new System.Drawing.Point(686, 72); this.button3.Name = "button3"; this.button3.Size = new System.Drawing.Size(136, 23); this.button3.TabIndex = 3; @@ -83,7 +85,7 @@ private void InitializeComponent() // btn_ogrinfo // this.btn_ogrinfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.btn_ogrinfo.Location = new System.Drawing.Point(660, 102); + this.btn_ogrinfo.Location = new System.Drawing.Point(686, 102); this.btn_ogrinfo.Name = "btn_ogrinfo"; this.btn_ogrinfo.Size = new System.Drawing.Size(136, 23); this.btn_ogrinfo.TabIndex = 4; @@ -94,16 +96,17 @@ private void InitializeComponent() // txtResults // this.txtResults.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.txtResults.Location = new System.Drawing.Point(660, 395); + this.txtResults.Location = new System.Drawing.Point(686, 453); this.txtResults.Multiline = true; this.txtResults.Name = "txtResults"; - this.txtResults.Size = new System.Drawing.Size(136, 255); + this.txtResults.Size = new System.Drawing.Size(136, 242); this.txtResults.TabIndex = 5; + this.txtResults.TextChanged += new System.EventHandler(this.txtResults_TextChanged); // // btnOgr2Ogr // this.btnOgr2Ogr.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.btnOgr2Ogr.Location = new System.Drawing.Point(660, 132); + this.btnOgr2Ogr.Location = new System.Drawing.Point(686, 132); this.btnOgr2Ogr.Name = "btnOgr2Ogr"; this.btnOgr2Ogr.Size = new System.Drawing.Size(136, 23); this.btnOgr2Ogr.TabIndex = 6; @@ -114,7 +117,7 @@ private void InitializeComponent() // btnGdalInfo // this.btnGdalInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.btnGdalInfo.Location = new System.Drawing.Point(660, 162); + this.btnGdalInfo.Location = new System.Drawing.Point(686, 162); this.btnGdalInfo.Name = "btnGdalInfo"; this.btnGdalInfo.Size = new System.Drawing.Size(136, 23); this.btnGdalInfo.TabIndex = 7; @@ -125,7 +128,7 @@ private void InitializeComponent() // btnGdalTranslate // this.btnGdalTranslate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.btnGdalTranslate.Location = new System.Drawing.Point(660, 192); + this.btnGdalTranslate.Location = new System.Drawing.Point(686, 192); this.btnGdalTranslate.Name = "btnGdalTranslate"; this.btnGdalTranslate.Size = new System.Drawing.Size(136, 23); this.btnGdalTranslate.TabIndex = 8; @@ -135,7 +138,7 @@ private void InitializeComponent() // button4 // this.button4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button4.Location = new System.Drawing.Point(660, 221); + this.button4.Location = new System.Drawing.Point(686, 221); this.button4.Name = "button4"; this.button4.Size = new System.Drawing.Size(136, 23); this.button4.TabIndex = 9; @@ -146,7 +149,7 @@ private void InitializeComponent() // button5 // this.button5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button5.Location = new System.Drawing.Point(660, 250); + this.button5.Location = new System.Drawing.Point(686, 250); this.button5.Name = "button5"; this.button5.Size = new System.Drawing.Size(136, 23); this.button5.TabIndex = 10; @@ -157,7 +160,7 @@ private void InitializeComponent() // button6 // this.button6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button6.Location = new System.Drawing.Point(660, 279); + this.button6.Location = new System.Drawing.Point(686, 279); this.button6.Name = "button6"; this.button6.Size = new System.Drawing.Size(136, 23); this.button6.TabIndex = 11; @@ -168,7 +171,7 @@ private void InitializeComponent() // button7 // this.button7.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button7.Location = new System.Drawing.Point(660, 308); + this.button7.Location = new System.Drawing.Point(686, 308); this.button7.Name = "button7"; this.button7.Size = new System.Drawing.Size(136, 23); this.button7.TabIndex = 12; @@ -179,7 +182,7 @@ private void InitializeComponent() // button8 // this.button8.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button8.Location = new System.Drawing.Point(660, 337); + this.button8.Location = new System.Drawing.Point(686, 337); this.button8.Name = "button8"; this.button8.Size = new System.Drawing.Size(136, 23); this.button8.TabIndex = 13; @@ -187,6 +190,39 @@ private void InitializeComponent() this.button8.UseVisualStyleBackColor = true; this.button8.Click += new System.EventHandler(this.button8_Click); // + // button9 + // + this.button9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button9.Location = new System.Drawing.Point(686, 366); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(136, 23); + this.button9.TabIndex = 14; + this.button9.Text = "DrawLabel"; + this.button9.UseVisualStyleBackColor = true; + this.button9.Click += new System.EventHandler(this.button9_Click); + // + // button10 + // + this.button10.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button10.Location = new System.Drawing.Point(686, 395); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(136, 23); + this.button10.TabIndex = 15; + this.button10.Text = "Spatial index"; + this.button10.UseVisualStyleBackColor = true; + this.button10.Click += new System.EventHandler(this.button10_Click); + // + // button11 + // + this.button11.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button11.Location = new System.Drawing.Point(686, 424); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(136, 23); + this.button11.TabIndex = 16; + this.button11.Text = "Prefetch Tiles"; + this.button11.UseVisualStyleBackColor = true; + this.button11.Click += new System.EventHandler(this.button11_Click); + // // axMap1 // this.axMap1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -195,28 +231,19 @@ private void InitializeComponent() this.axMap1.Enabled = true; this.axMap1.Location = new System.Drawing.Point(2, 2); this.axMap1.Name = "axMap1"; - // this.axMap1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axMap1.OcxState"))); - this.axMap1.Size = new System.Drawing.Size(651, 649); + this.axMap1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axMap1.OcxState"))); + this.axMap1.Size = new System.Drawing.Size(677, 694); this.axMap1.TabIndex = 0; this.axMap1.FileDropped += new AxMapWinGIS._DMapEvents_FileDroppedEventHandler(this.axMap1_FileDropped); this.axMap1.ShapeIdentified += new AxMapWinGIS._DMapEvents_ShapeIdentifiedEventHandler(this.axMap1_ShapeIdentified); // - // button9 - // - this.button9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.button9.Location = new System.Drawing.Point(660, 366); - this.button9.Name = "button9"; - this.button9.Size = new System.Drawing.Size(136, 23); - this.button9.TabIndex = 14; - this.button9.Text = "DrawLabel"; - this.button9.UseVisualStyleBackColor = true; - this.button9.Click += new System.EventHandler(this.button9_Click); - // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(805, 654); + this.ClientSize = new System.Drawing.Size(831, 699); + this.Controls.Add(this.button11); + this.Controls.Add(this.button10); this.Controls.Add(this.button9); this.Controls.Add(this.button8); this.Controls.Add(this.button7); @@ -257,6 +284,8 @@ private void InitializeComponent() private System.Windows.Forms.Button button7; private System.Windows.Forms.Button button8; private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + private System.Windows.Forms.Button button11; } } diff --git a/unittests/interopCreator/Form1.cs b/unittests/interopCreator/Form1.cs index cfa26b60..bf730796 100644 --- a/unittests/interopCreator/Form1.cs +++ b/unittests/interopCreator/Form1.cs @@ -1,18 +1,30 @@ -using System.Diagnostics; -using System.Runtime.InteropServices; +using System; +using System.Diagnostics; +using System.IO; +using System.Windows.Forms; +using AxMapWinGIS; +using MapWinGIS; namespace interopCreator { - using System; - using System.IO; - using System.Windows.Forms; - using MapWinGIS; - - public partial class Form1 : Form + public partial class Form1 : Form, ICallback { + private static readonly GlobalSettings _settings = new GlobalSettings(); + public Form1() { InitializeComponent(); + _settings.ApplicationCallback = this; + } + + public void Progress(string KeyOfSender, int Percent, string Message) + { + txtResults.Text += $@"{Percent} {Message}"; + } + + public void Error(string KeyOfSender, string ErrorMsg) + { + txtResults.Text += $@"Error: {ErrorMsg}"; } private void CheckNewMethods() @@ -39,17 +51,17 @@ private void CheckNewMethods() var utils = new Utils(); utils.ClipGridWithPolygon("test", sfSimple.Shape[0], "new", false); - utils.Polygonize(string.Empty, string.Empty, 1, false, string.Empty, "ESRI Shapefile", string.Empty, "DN", null); + utils.Polygonize(string.Empty, string.Empty, 1, false, string.Empty, "ESRI Shapefile", string.Empty); - utils.GDALInfo(string.Empty, string.Empty, null); - utils.TranslateRaster(string.Empty, string.Empty, string.Empty, null); + utils.GDALInfo(string.Empty, string.Empty); + utils.TranslateRaster(string.Empty, string.Empty, string.Empty); - utils.OGRInfo(string.Empty, string.Empty, null, null); - utils.OGR2OGR(string.Empty, string.Empty, string.Empty, null); - utils.GDALAddOverviews(string.Empty, string.Empty, string.Empty, null); - utils.GDALBuildVrt(string.Empty, string.Empty, null); - utils.GDALRasterize(string.Empty, string.Empty, string.Empty, null); - utils.GDALWarp(string.Empty, string.Empty, string.Empty, null); + utils.OGRInfo(string.Empty, string.Empty); + utils.OGR2OGR(string.Empty, string.Empty, string.Empty); + utils.GDALAddOverviews(string.Empty, string.Empty, string.Empty); + utils.GDALBuildVrt(string.Empty, string.Empty); + utils.GDALRasterize(string.Empty, string.Empty, string.Empty); + utils.GDALWarp(string.Empty, string.Empty, string.Empty); var ds = new GdalDataset(); var subDatasetCount = ds.SubDatasetCount; @@ -62,7 +74,7 @@ private void ClipGridWithPolygon() var gridFilename = Path.Combine(workingFolder, "AHN2.asc"); var sf = new Shapefile(); - sf.Open(Path.Combine(workingFolder, "Areas.shp"), null); + sf.Open(Path.Combine(workingFolder, "Areas.shp")); var numShapes = sf.NumShapes; var clippedWrong = 0; var clippedGood = 0; @@ -70,32 +82,24 @@ private void ClipGridWithPolygon() // Needed for the new method: var utils = new Utils(); var grd = new Grid(); - grd.Open(gridFilename, GridDataType.UnknownDataType, true, GridFileType.UseExtension, null); + grd.Open(gridFilename); for (var i = 0; i < numShapes; i++) { - var polygon = sf.get_Shape(i); + var polygon = sf.Shape[i]; var resultGrid = Path.Combine(tempFolder, "AHN2_clipped" + i + ".asc"); // Using thr mwGeoProc version takes almost 4 hours with this data: // if (MapWinGeoProc.SpatialOperations.ClipGridWithPolygon(ref gridFilename, ref polygon, ref resultGrid)) if (utils.ClipGridWithPolygon2(grd, polygon, resultGrid, false)) - { clippedGood++; - } else - { clippedWrong++; - /* - testsMethods.ReportMessage( - string.Format( - "Clipping grid with polygon number {0} failed. Error: {1}", i, MapWinGeoProc.Error.GetLastErrorMsg())); - */ - } } - var msg = string.Empty; - msg = clippedWrong == 0 ? "All tests successful!" : string.Format("{0} clippings went OK, {1} went wrong", clippedGood, clippedWrong); + var msg = clippedWrong == 0 + ? "All tests successful!" + : $"{clippedGood} clippings went OK, {clippedWrong} went wrong"; MessageBox.Show(msg); } @@ -122,7 +126,8 @@ private static void GridStatistics() var sf = new ShapefileClass(); if (!sf.Open(Path.Combine(workingFolder, "ARK.shp"))) { - writer.WriteLine(DateTime.Now + " Could not open shapefile. Reason " + sf.ErrorMsg[sf.LastErrorCode]); + writer.WriteLine( + DateTime.Now + " Could not open shapefile. Reason " + sf.ErrorMsg[sf.LastErrorCode]); return; } @@ -130,15 +135,12 @@ private static void GridStatistics() var netCdfFiles = Directory.GetFiles(workingFolder, "*.nc"); var utils = new UtilsClass(); - var settings = new GlobalSettings(); + _settings.ResetGdalError(); var amersfoort = new GeoProjectionClass(); amersfoort.ImportFromEPSG(28992); // Check projection: - if (!sf.GeoProjection.IsSame[amersfoort]) - { - sf.GeoProjection = amersfoort.Clone(); - } + if (!sf.GeoProjection.IsSame[amersfoort]) sf.GeoProjection = amersfoort.Clone(); // Loop through all netCDF files in folder: foreach (var netCdfFile in netCdfFiles) @@ -147,15 +149,16 @@ private static void GridStatistics() if (!grd.Open(netCdfFile)) { writer.WriteLine(DateTime.Now + " Could not open {0}. Reason: {1}, GDAL Error: {2}", netCdfFile, - grd.ErrorMsg[grd.LastErrorCode], settings.GdalLastErrorMsg); + grd.ErrorMsg[grd.LastErrorCode], _settings.GdalLastErrorMsg); continue; } currentProcess.Refresh(); - writer.WriteLine(DateTime.Now + "Loaded grid " + netCdfFile + " Current memory " + FormatBytes(currentProcess.WorkingSet64)); + writer.WriteLine(DateTime.Now + "Loaded grid " + netCdfFile + " Current memory " + + FormatBytes(currentProcess.WorkingSet64)); var header = grd.Header; - var noDataValue = (double)grd.Header.NodataValue; + var noDataValue = (double) grd.Header.NodataValue; var extents = grd.Extents; // Set projection: @@ -168,12 +171,13 @@ private static void GridStatistics() if (!grd.OpenBand(i)) { writer.WriteLine(DateTime.Now + " Could not open band {0}. Reason: {1}, GDAL Error: {2}", i, - grd.ErrorMsg[grd.LastErrorCode], settings.GdalLastErrorMsg); + grd.ErrorMsg[grd.LastErrorCode], _settings.GdalLastErrorMsg); continue; } currentProcess.Refresh(); - writer.WriteLine(DateTime.Now + " Working with band {0} Current memory: {1} ", i, FormatBytes(currentProcess.WorkingSet64)); + writer.WriteLine(DateTime.Now + " Working with band {0} Current memory: {1} ", i, + FormatBytes(currentProcess.WorkingSet64)); var mean = 0d; var min = 0d; var max = 0d; @@ -185,20 +189,22 @@ private static void GridStatistics() !utils.GridStatisticsForPolygon(grd, header, extents, shp, noDataValue, ref mean, ref min, ref max)) - { - writer.WriteLine(DateTime.Now + " Error getting statistics: " + utils.ErrorMsg[utils.LastErrorCode]); - } + writer.WriteLine(DateTime.Now + " Error getting statistics: " + + utils.ErrorMsg[utils.LastErrorCode]); currentProcess.Refresh(); - writer.WriteLine(DateTime.Now + " Mean: {0}, Min: {1}, Max: {2}, Current memory: {3}", mean, min, max, FormatBytes(currentProcess.WorkingSet64)); + writer.WriteLine(DateTime.Now + " Mean: {0}, Min: {1}, Max: {2}, Current memory: {3}", mean, + min, max, FormatBytes(currentProcess.WorkingSet64)); } } // Close grid: grd.Close(); currentProcess.Refresh(); - writer.WriteLine(DateTime.Now + " Closed grid Current memory: " + FormatBytes(currentProcess.WorkingSet64)); + writer.WriteLine(DateTime.Now + " Closed grid Current memory: " + + FormatBytes(currentProcess.WorkingSet64)); } + currentProcess.Refresh(); writer.WriteLine(DateTime.Now + " Done. Current memory: " + FormatBytes(currentProcess.WorkingSet64)); } @@ -208,15 +214,12 @@ private static void GridStatistics() private static string FormatBytes(long bytes) { - string[] Suffix = { "B", "KB", "MB", "GB", "TB" }; + string[] Suffix = {"B", "KB", "MB", "GB", "TB"}; int i; double dblSByte = bytes; - for (i = 0; i < Suffix.Length && bytes >= 1024; i++, bytes /= 1024) - { - dblSByte = bytes / 1024.0; - } + for (i = 0; i < Suffix.Length && bytes >= 1024; i++, bytes /= 1024) dblSByte = bytes / 1024.0; - return string.Format("{0:0.##} {1}", dblSByte, Suffix[i]); + return $"{dblSByte:0.##} {Suffix[i]}"; } private void button3_Click(object sender, EventArgs e) @@ -258,35 +261,33 @@ private void btn_ogrinfo_Click(object sender, EventArgs e) private void btnOgr2Ogr_Click(object sender, EventArgs e) { - GlobalSettings settings = new GlobalSettings(); - settings.ResetGdalError(); - UtilsClass utils = new MapWinGIS.UtilsClass(); - string options = "--config CONFIG_FILE \"D:\\dev\\GIS-Data\\Djordje\\osmconf.ini\" --config OSM_USE_CUSTOM_INDEXING NO -skipfailures -f \"ESRI Shapefile\""; - bool result = utils.OGR2OGR(@"D:\dev\GIS-Data\Djordje\map.osm", @"D:\dev\GIS-Data\Djordje\osm-result", options); + _settings.ResetGdalError(); + var utils = new UtilsClass(); + var options = + "--config CONFIG_FILE \"D:\\dev\\GIS-Data\\Djordje\\osmconf.ini\" --config OSM_USE_CUSTOM_INDEXING NO -skipfailures -f \"ESRI Shapefile\""; + var result = utils.OGR2OGR(@"D:\dev\GIS-Data\Djordje\map.osm", @"D:\dev\GIS-Data\Djordje\osm-result", + options); if (!result) { // Both line should be the same: Debug.WriteLine(utils.ErrorMsgFromObject(utils)); Debug.WriteLine(utils.ErrorMsg[utils.LastErrorCode]); - Debug.WriteLine(settings.GdalLastErrorMsg); + Debug.WriteLine(_settings.GdalLastErrorMsg); } txtResults.Text = @"OGR2OGR result: " + result; if (!result) return; // Add files: - string[] shapefileFilenames = Directory.GetFiles(@"D:\dev\GIS-Data\Djordje\osm-result\", "*.shp"); - foreach (string filename in shapefileFilenames) - { + var shapefileFilenames = Directory.GetFiles(@"D:\dev\GIS-Data\Djordje\osm-result\", "*.shp"); + foreach (var filename in shapefileFilenames) axMap1.AddLayerFromFilename(filename, tkFileOpenStrategy.fosVectorLayer, true); - } } private void btnGdalInfo_Click(object sender, EventArgs e) { - GlobalSettings settings = new GlobalSettings(); - settings.ResetGdalError(); - UtilsClass utils = new MapWinGIS.UtilsClass(); + _settings.ResetGdalError(); + var utils = new UtilsClass(); var filename = @"D:\dev\GIS-Data\HDF5\RAD_NL25_RAC_03H_201612040000.h5"; var result = utils.GDALInfo(filename, ""); @@ -296,8 +297,8 @@ private void btnGdalInfo_Click(object sender, EventArgs e) var hndle = axMap1.AddLayerFromFilename(filename, tkFileOpenStrategy.fosAutoDetect, true); if (hndle >= 1) return; - txtResults.Text += @" GDAL Error: " + settings.GdalLastErrorMsg - + axMap1.get_ErrorMsg(axMap1.LastErrorCode); + txtResults.Text += @" GDAL Error: " + _settings.GdalLastErrorMsg + + axMap1.get_ErrorMsg(axMap1.LastErrorCode); var grd = new GridClass(); var opened = grd.Open(filename); if (!opened) @@ -320,14 +321,13 @@ private void btnGdalInfo_Click(object sender, EventArgs e) return; } - txtResults.Text = @" GDAL Error: " + settings.GdalLastErrorMsg - + @" GdalPluginPath: " + settings.GdalPluginPath; - + txtResults.Text = @" GDAL Error: " + _settings.GdalLastErrorMsg + + @" GdalPluginPath: " + _settings.GdalPluginPath; } private void button4_Click(object sender, EventArgs e) { - var settings = new GlobalSettings { OgrStringEncoding = tkOgrEncoding.oseUtf8 }; + _settings.OgrStringEncoding = tkOgrEncoding.oseUtf8; var sf = new ShapefileClass(); if (!sf.Open(@"D:\dev\GIS-Data\Issues\Persian\roads.shp")) @@ -344,6 +344,7 @@ private void button4_Click(object sender, EventArgs e) // Add shapefile to map: var hndl = axMap1.AddLayer(sf, true); + txtResults.Text += @"Added layer with handle " + hndl; } private void button5_Click(object sender, EventArgs e) @@ -376,8 +377,8 @@ private void button6_Click(object sender, EventArgs e) sfPoint.CreateNewWithShapeID("", ShpfileType.SHP_POINT); for (var i = 0; i < numPoints; i++) { - var x = extents.xMin + (width * random.NextDouble()); - var y = extents.yMin + (height * random.NextDouble()); + var x = extents.xMin + width * random.NextDouble(); + var y = extents.yMin + height * random.NextDouble(); var shpPoint = new Shape(); shpPoint.Create(ShpfileType.SHP_POINT); shpPoint.AddPoint(x, y); @@ -393,14 +394,12 @@ private void button7_Click(object sender, EventArgs e) const string filename = @"J:\Akkerweb.Shared\tmp\ndre-copied.tif"; // axMap1.AddLayerFromFilename(filename, tkFileOpenStrategy.fosAutoDetect, true); var fm = new FileManager(); - var obj = fm.Open(filename, tkFileOpenStrategy.fosAutoDetect, null); + var obj = fm.Open(filename); if (obj != null && fm.LastOpenIsSuccess) { var handle = axMap1.AddLayer(obj, true); if (handle == -1) - { MessageBox.Show(@"Failed to add layer to the map: " + axMap1.get_ErrorMsg(axMap1.LastErrorCode)); - } } else { @@ -413,31 +412,26 @@ private void button8_Click(object sender, EventArgs e) var utils = new Utils(); var grd = new Grid(); if (!grd.Open(@"J:\Akkerweb.Shared\tmp\ndre-copied.tif", GridDataType.FloatDataType)) - { throw new Exception("Can't open grid file: " + grd.ErrorMsg[grd.LastErrorCode]); - } var sf = new Shapefile(); if (!sf.Open(@"J:\Akkerweb.Shared\tmp\Fishnet.shp")) - { throw new Exception("Can't open shapefile file: " + sf.ErrorMsg[sf.LastErrorCode]); - } if (!utils.GridStatisticsToShapefile(grd, sf, false, true)) - { throw new Exception("GridStatisticsToShapefile failed: " + utils.ErrorMsg[utils.LastErrorCode]); - } axMap1.AddLayer(grd, true); axMap1.AddLayer(sf, true); } - private void axMap1_ShapeIdentified(object sender, AxMapWinGIS._DMapEvents_ShapeIdentifiedEvent e) + private void axMap1_ShapeIdentified(object sender, _DMapEvents_ShapeIdentifiedEvent e) { axMap1.ZoomToShape(e.layerHandle, e.shapeIndex); } - private void axMap1_FileDropped(object sender, AxMapWinGIS._DMapEvents_FileDroppedEvent e) + private void axMap1_FileDropped(object sender, _DMapEvents_FileDroppedEvent e) { - axMap1.AddLayerFromFilename(e.filename, tkFileOpenStrategy.fosAutoDetect, true); + txtResults.Text += $@"Opening {e.filename} after dropping."; + axMap1.AddLayerFromFilename(e.filename, tkFileOpenStrategy.fosAutoDetect, true); } private void button9_Click(object sender, EventArgs e) @@ -461,5 +455,36 @@ private void button9_Click(object sender, EventArgs e) axMap1.DrawCircle(0, 0, 0.1, utils.ColorByName(tkMapColor.Yellow), true); axMap1.DrawLabel("ABC", 0, 0, 0); } + + private void button10_Click(object sender, EventArgs e) + { + axMap1.AddLayerFromFilename( + @"D:\dev\MapwinGIS\GitHub\unittests\MapWinGISTests\Testdata\Issues\MWGIS-98\3dPoint.shp", + tkFileOpenStrategy.fosAutoDetect, true); + } + + private void button11_Click(object sender, EventArgs e) + { + if (axMap1.Projection == tkMapProjection.PROJECTION_NONE) + { + axMap1.Projection = tkMapProjection.PROJECTION_GOOGLE_MERCATOR; + axMap1.Tiles.Provider = tkTileProvider.OpenStreetMap; + axMap1.KnownExtents = tkKnownExtents.keNetherlands; + } + + axMap1.ZoomBehavior = tkZoomBehavior.zbUseTileLevels; + var outputFolder = $@"D:\tmp\axmap.tiles\{axMap1.Tiles.Provider.ToString()}"; + if (!Directory.Exists(outputFolder)) Directory.CreateDirectory(outputFolder); + + var numTilesToCache = axMap1.Tiles.PrefetchToFolder(axMap1.Extents, axMap1.Tiles.CurrentZoom, + Convert.ToInt32(axMap1.Tiles.Provider), outputFolder, ".png", null); + txtResults.Text += $@"{Environment.NewLine}numTilesToCache: " + numTilesToCache; + } + + private void txtResults_TextChanged(object sender, EventArgs e) + { + txtResults.SelectionStart = txtResults.Text.Length; + txtResults.ScrollToCaret(); + } } -} +} \ No newline at end of file diff --git a/unittests/interopCreator/Form1.resx b/unittests/interopCreator/Form1.resx index a7bfb9e5..45e83b0b 100644 --- a/unittests/interopCreator/Form1.resx +++ b/unittests/interopCreator/Form1.resx @@ -121,11 +121,11 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACFTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5BeEhvc3QrU3RhdGUBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAuQAAAAIB - AAAAAQAAAAAAAAAAAAAAAKQAAAAxAAsASEMAABNDAAAAAAAA////AHsUrkfhepQ/CgAzMzMzMzPTPwAA - AAAAFAAAAAEAAAAAAAAAAADgPwAAAQAAAAAAAAAAAAADAAAABgIAAAADAAAABgAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAgAAAAEBAAAABAAAAP////////// - AAAAAAs= + ZW0uV2luZG93cy5Gb3Jtcy5BeEhvc3QrU3RhdGUBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAugAAAAIB + AAAAAQAAAAAAAAAAAAAAAKUAAAAxAAwA+EUAALpHAAAAAAAA////AHsUrkfhepQ/AAAzMzMzMzPTPwAA + AAAAFAAAAAEAAAAAAAAAAADgPwAAAQAAAAAAAAEAAAAAAQAAAAIAAAADAAAABgAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAEBAAAABAAAAP////////// + AAAAAAAL \ No newline at end of file diff --git a/unittests/interopCreator/Properties/AssemblyInfo.cs b/unittests/interopCreator/Properties/AssemblyInfo.cs index 3a855284..5582514b 100644 --- a/unittests/interopCreator/Properties/AssemblyInfo.cs +++ b/unittests/interopCreator/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Microsoft")] [assembly: AssemblyProduct("interopCreator")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012-2018")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/unittests/unittests.sln b/unittests/unittests.sln index f123bb23..3da3eaa3 100644 --- a/unittests/unittests.sln +++ b/unittests/unittests.sln @@ -1,15 +1,18 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2024 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "interopCreator", "interopCreator\interopCreator.csproj", "{607BE05F-F636-40CD-BFA9-49BF798FC7B2}" - ProjectSection(ProjectDependencies) = postProject - {9E7451A0-C7BB-4036-82A4-5DFCD0150D66} = {9E7451A0-C7BB-4036-82A4-5DFCD0150D66} - EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MapWinGISTests", "MapWinGISTests\MapWinGISTests.csproj", "{11B56223-8866-44CB-9FCA-AE58A8EBEF72}" + ProjectSection(ProjectDependencies) = postProject + {607BE05F-F636-40CD-BFA9-49BF798FC7B2} = {607BE05F-F636-40CD-BFA9-49BF798FC7B2} + EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestExecutor", "TestExecutor\TestExecutor.csproj", "{9E7451A0-C7BB-4036-82A4-5DFCD0150D66}" + ProjectSection(ProjectDependencies) = postProject + {607BE05F-F636-40CD-BFA9-49BF798FC7B2} = {607BE05F-F636-40CD-BFA9-49BF798FC7B2} + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -59,4 +62,7 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {158CEFA1-563C-4589-8940-F8485A479150} + EndGlobalSection EndGlobal