362 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			362 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
| /*
 | |
| www.sourceforge.net/projects/dfhack
 | |
| Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf
 | |
| 
 | |
| This software is provided 'as-is', without any express or implied
 | |
| warranty. In no event will the authors be held liable for any
 | |
| damages arising from the use of this software.
 | |
| 
 | |
| Permission is granted to anyone to use this software for any
 | |
| purpose, including commercial applications, and to alter it and
 | |
| redistribute it freely, subject to the following restrictions:
 | |
| 
 | |
| 1. The origin of this software must not be misrepresented; you must
 | |
| not claim that you wrote the original software. If you use this
 | |
| software in a product, an acknowledgment in the product documentation
 | |
| would be appreciated but is not required.
 | |
| 
 | |
| 2. Altered source versions must be plainly marked as such, and
 | |
| must not be misrepresented as being the original software.
 | |
| 
 | |
| 3. This notice may not be removed or altered from any source
 | |
| distribution.
 | |
| */
 | |
| 
 | |
| #ifndef BUILD_DFHACK_LIB
 | |
| #   define BUILD_DFHACK_LIB
 | |
| #endif
 | |
| 
 | |
| #include "DFCommon.h"
 | |
| #include "DFHackAPI.h"
 | |
| #include "DFHackAPIc.h"
 | |
| 
 | |
| #ifdef LINUX_BUILD
 | |
| # ifndef secure_strcpy
 | |
| #  define secure_strcpy(dst, size, buf) strcpy((dst), (buf))
 | |
| # endif
 | |
| #else
 | |
| # if defined(_MSC_VER) && _MSC_VER >= 1400
 | |
| #  ifndef secure_strcpy
 | |
| #   define secure_strcpy(dst, size, buf) strcpy_s((dst), (size), (buf))
 | |
| #  endif
 | |
| # else
 | |
| #  ifndef secure_strcpy
 | |
| #   define secure_strcpy(dst, size, buf) strcpy((dst), (buf))
 | |
| #  endif
 | |
| # endif
 | |
| #endif
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C"
 | |
| {
 | |
| #endif
 | |
| 
 | |
| // The C interface for vector management
 | |
|     DFHACKAPI void DFHackAPIVector_free (DFHackAPIVectorC *vector)
 | |
|     {
 | |
|         uint32_t i;
 | |
|         switch (vector->type)
 | |
|         {
 | |
|             case DFHackAPIVectorTypeC_Normal:
 | |
|                 delete [] (vector->data);
 | |
|                 break;
 | |
|             case DFHackAPIVectorTypeC_Matgloss:
 | |
|                 delete [] ( (t_matgloss *) vector->data);
 | |
|                 break;
 | |
|             case DFHackAPIVectorTypeC_Uint16:
 | |
|                 delete [] ( (uint16_t *) vector->data);
 | |
|                 break;
 | |
|             case DFHackAPIVectorTypeC_Vein:
 | |
|                 delete [] ( (t_vein *) vector->data);
 | |
|                 break;
 | |
|             case DFHackAPIVectorTypeC_String:
 | |
|                 for (i = 0; i < vector->length; i++)
 | |
|                     delete [] ( (char **) vector->data) [i];
 | |
|                 delete [] ( (char **) vector->data);
 | |
|                 break;
 | |
|             case DFHackAPIVectorTypeC_Recursive:
 | |
|                 for (i = 0; i < vector->length; i++)
 | |
|                     DFHackAPIVector_free (& ( (DFHackAPIVectorC *) vector->data) [i]);
 | |
|                 delete [] ( (DFHackAPIVectorC *) vector->data);
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         vector->type = DFHackAPIVectorTypeC_Normal;
 | |
|         vector->length = 0;
 | |
|         vector->data = 0;
 | |
|     }
 | |
| 
 | |
| // The C interface to DFHackAPI (for multiple language support)
 | |
|     DFHACKAPI DFHackAPIHandle CreateDFHackAPI (const char *path_to_xml)
 | |
|     {
 | |
|         return new DFHackAPIImpl (path_to_xml);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI void DestroyDFHackAPI (DFHackAPIHandle self)
 | |
|     {
 | |
|         if (self != NULL)
 | |
|             delete self;
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_Attach (DFHackAPIHandle self)
 | |
|     {
 | |
|         return self->Attach();
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_Detach (DFHackAPIHandle self)
 | |
|     {
 | |
|         return self->Detach();
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_isAttached (DFHackAPIHandle self)
 | |
|     {
 | |
|         return self->isAttached();
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadStoneMatgloss (DFHackAPIHandle self, DFHackAPIVectorC *output)
 | |
|     {
 | |
|         vector<t_matgloss> result;
 | |
|         uint32_t i;
 | |
|         bool retn = self->ReadStoneMatgloss (result);
 | |
| 
 | |
|         output->type = DFHackAPIVectorTypeC_Matgloss;
 | |
|         output->length = result.size();
 | |
|         output->data = new t_matgloss[output->length];
 | |
|         for (i = 0; i < output->length; i++)
 | |
|             ( (t_matgloss *) output->data) [i] = result[i];
 | |
| 
 | |
|         return retn;
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadWoodMatgloss (DFHackAPIHandle self, DFHackAPIVectorC *output)
 | |
|     {
 | |
|         vector<t_matgloss> result;
 | |
|         uint32_t i;
 | |
|         bool retn = self->ReadWoodMatgloss (result);
 | |
| 
 | |
|         output->type = DFHackAPIVectorTypeC_Matgloss;
 | |
|         output->length = result.size();
 | |
|         output->data = new t_matgloss[output->length];
 | |
|         for (i = 0; i < output->length; i++)
 | |
|             ( (t_matgloss *) output->data) [i] = result[i];
 | |
| 
 | |
|         return retn;
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadMetalMatgloss (DFHackAPIHandle self, DFHackAPIVectorC *output)
 | |
|     {
 | |
|         vector<t_matgloss> result;
 | |
|         uint32_t i;
 | |
|         bool retn = self->ReadMetalMatgloss (result);
 | |
| 
 | |
|         output->type = DFHackAPIVectorTypeC_Matgloss;
 | |
|         output->length = result.size();
 | |
|         output->data = new t_matgloss[output->length];
 | |
|         for (i = 0; i < output->length; i++)
 | |
|             ( (t_matgloss *) output->data) [i] = result[i];
 | |
| 
 | |
|         return retn;
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadPlantMatgloss (DFHackAPIHandle self, DFHackAPIVectorC *output)
 | |
|     {
 | |
|         vector<t_matgloss> result;
 | |
|         uint32_t i;
 | |
|         bool retn = self->ReadPlantMatgloss (result);
 | |
| 
 | |
|         output->type = DFHackAPIVectorTypeC_Matgloss;
 | |
|         output->length = result.size();
 | |
|         output->data = new t_matgloss[output->length];
 | |
|         for (i = 0; i < output->length; i++)
 | |
|             ( (t_matgloss *) output->data) [i] = result[i];
 | |
| 
 | |
|         return retn;
 | |
|     }
 | |
|     
 | |
|     DFHACKAPI bool DFHackAPI_ReadCreatureMatgloss (DFHackAPIHandle self, DFHackAPIVectorC *output)
 | |
|     {
 | |
|         vector<t_matgloss> result;
 | |
|         uint32_t i;
 | |
|         bool retn = self->ReadCreatureMatgloss (result);
 | |
|         
 | |
|         output->type = DFHackAPIVectorTypeC_Matgloss;
 | |
|         output->length = result.size();
 | |
|         output->data = new t_matgloss[output->length];
 | |
|         for (i = 0; i < output->length; i++)
 | |
|             ( (t_matgloss *) output->data) [i] = result[i];
 | |
|         
 | |
|         return retn;
 | |
|     }
 | |
|     DFHACKAPI bool DFHackAPI_ReadGeology (DFHackAPIHandle self, DFHackAPIVectorC *assign)
 | |
|     {
 | |
|         vector< vector<uint16_t> > result;
 | |
|         uint32_t i, j;
 | |
|         bool retn = self->ReadGeology (result);
 | |
| 
 | |
|         assign->type = DFHackAPIVectorTypeC_Recursive;
 | |
|         assign->length = result.size();
 | |
|         assign->data = new DFHackAPIVectorC[assign->length];
 | |
|         for (i = 0; i < assign->length; i++)
 | |
|         {
 | |
|             DFHackAPIVectorC ¤t = ( (DFHackAPIVectorC *) assign->data) [i];
 | |
|             current.type = DFHackAPIVectorTypeC_Uint16;
 | |
|             current.length = result[i].size();
 | |
|             current.data = new uint16_t[current.length];
 | |
|             for (j = 0; j < current.length; j++)
 | |
|                 ( (uint16_t *) current.data) [j] = result[i][j];
 | |
|         }
 | |
| 
 | |
|         return retn;
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_InitMap (DFHackAPIHandle self)
 | |
|     {
 | |
|         return self->InitMap();
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_DestroyMap (DFHackAPIHandle self)
 | |
|     {
 | |
|         return self->DestroyMap();
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI void DFHackAPI_getSize (DFHackAPIHandle self, uint32_t* x, uint32_t* y, uint32_t* z)
 | |
|     {
 | |
|         return self->getSize (*x, *y, *z);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_isValidBlock (DFHackAPIHandle self, uint32_t blockx, uint32_t blocky, uint32_t blockz)
 | |
|     {
 | |
|         return self->isValidBlock (blockx, blocky, blockz);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadTileTypes (DFHackAPIHandle self, uint32_t blockx, uint32_t blocky, uint32_t blockz, uint16_t *buffer)
 | |
|     {
 | |
|         return self->ReadTileTypes (blockx, blocky, blockz, buffer);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_WriteTileTypes (DFHackAPIHandle self, uint32_t blockx, uint32_t blocky, uint32_t blockz, uint16_t *buffer)
 | |
|     {
 | |
|         return self->WriteTileTypes (blockx, blocky, blockz, buffer);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadDesignations (DFHackAPIHandle self, uint32_t blockx, uint32_t blocky, uint32_t blockz, uint32_t *buffer)
 | |
|     {
 | |
|         return self->ReadDesignations (blockx, blocky, blockz, buffer);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_WriteDesignations (DFHackAPIHandle self, uint32_t blockx, uint32_t blocky, uint32_t blockz, uint32_t *buffer)
 | |
|     {
 | |
|         return self->WriteDesignations (blockx, blocky, blockz, buffer);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadOccupancy (DFHackAPIHandle self, uint32_t blockx, uint32_t blocky, uint32_t blockz, uint32_t *buffer)
 | |
|     {
 | |
|         return self->ReadOccupancy (blockx, blocky, blockz, buffer);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_WriteOccupancy (DFHackAPIHandle self, uint32_t blockx, uint32_t blocky, uint32_t blockz, uint32_t *buffer)
 | |
|     {
 | |
|         return self->WriteOccupancy (blockx, blocky, blockz, buffer);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadRegionOffsets (DFHackAPIHandle self, uint32_t blockx, uint32_t blocky, uint32_t blockz, uint8_t *buffer)
 | |
|     {
 | |
|         return self->ReadRegionOffsets (blockx, blocky, blockz, buffer);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadVeins (DFHackAPIHandle self, uint32_t blockx, uint32_t blocky, uint32_t blockz, DFHackAPIVectorC * veins)
 | |
|     {
 | |
|         vector<t_vein> result;
 | |
|         uint32_t i;
 | |
|         bool retn = self->ReadVeins (blockx, blocky, blockz, result);
 | |
| 
 | |
|         veins->type = DFHackAPIVectorTypeC_Vein;
 | |
|         veins->length = result.size();
 | |
|         veins->data = new t_vein[veins->length];
 | |
|         for (i = 0; i < veins->length; i++)
 | |
|             ( (t_vein *) veins->data) [i] = result[i];
 | |
| 
 | |
|         return retn;
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI uint32_t DFHackAPI_InitReadConstructions (DFHackAPIHandle self)
 | |
|     {
 | |
|         return self->InitReadConstructions();
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadConstruction (DFHackAPIHandle self, const uint32_t *index, t_construction * construction)
 | |
|     {
 | |
|         return self->ReadConstruction (*index, *construction);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI void DFHackAPI_FinishReadConstructions (DFHackAPIHandle self)
 | |
|     {
 | |
|         self->FinishReadConstructions();
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI uint32_t DFHackAPI_InitReadBuildings (DFHackAPIHandle self, DFHackAPIVectorC *v_buildingtypes)
 | |
|     {
 | |
|         vector<string> result;
 | |
|         uint32_t i;
 | |
|         uint32_t retn = self->InitReadBuildings (result);
 | |
| 
 | |
|         v_buildingtypes->type = DFHackAPIVectorTypeC_String;
 | |
|         v_buildingtypes->length = result.size();
 | |
|         v_buildingtypes->data = new char *[v_buildingtypes->length];
 | |
|         for (i = 0; i < v_buildingtypes->length; i++)
 | |
|         {
 | |
|             char *str = new char[result[i].size() + 1];
 | |
|             secure_strcpy (str, result[i].size() + 1, result[i].c_str());
 | |
|             ( (char **) v_buildingtypes->data) [i] = str;
 | |
|         }
 | |
| 
 | |
|         return retn;
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadBuilding (DFHackAPIHandle self, const uint32_t *index, t_building * building)
 | |
|     {
 | |
|         return self->ReadBuilding (*index, *building);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI void DFHackAPI_FinishReadBuildings (DFHackAPIHandle self)
 | |
|     {
 | |
|         self->FinishReadBuildings();
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI uint32_t DFHackAPI_InitReadVegetation (DFHackAPIHandle self)
 | |
|     {
 | |
|         return self->InitReadVegetation();
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadVegetation (DFHackAPIHandle self, const uint32_t *index, t_tree_desc * shrubbery)
 | |
|     {
 | |
|         return self->ReadVegetation (*index, *shrubbery);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI void DFHackAPI_FinishReadVegetation (DFHackAPIHandle self)
 | |
|     {
 | |
|         self->FinishReadVegetation();
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI uint32_t DFHackAPI_InitReadCreatures (DFHackAPIHandle self)
 | |
|     {
 | |
|         return self->InitReadCreatures();
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI bool DFHackAPI_ReadCreature (DFHackAPIHandle self, const uint32_t *index, t_creature * furball)
 | |
|     {
 | |
|         return self->ReadCreature (*index, *furball);
 | |
|     }
 | |
| 
 | |
|     DFHACKAPI void DFHackAPI_FinishReadCreatures (DFHackAPIHandle self)
 | |
|     {
 | |
|         self->FinishReadCreatures();
 | |
|     }
 | |
|     DFHACKAPI void DFHackAPI_ReadRaw (DFHackAPIHandle self, const uint32_t &offset, const uint32_t &size, uint8_t *target)
 | |
|     {
 | |
|         self->ReadRaw(offset, size, target);
 | |
|     }
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 |