From 6b965ecbb1bb95a7a750e731001ac347a8ac142b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 21 Jan 2014 17:13:36 -0700 Subject: [PATCH] Added DataTableTool project --- engine/shared/application/CMakeLists.txt | 1 + .../application/DataTableTool/CMakeLists.txt | 6 + .../DataTableTool/src/CMakeLists.txt | 58 +++ .../src/shared/DataTableTool.cpp | 396 ++++++++++++++++++ .../DataTableTool/src/shared/DataTableTool.h | 47 +++ .../src/shared/FirstDataTableTool.cpp | 1 + .../src/shared/FirstDataTableTool.h | 1 + 7 files changed, 510 insertions(+) create mode 100644 engine/shared/application/DataTableTool/CMakeLists.txt create mode 100644 engine/shared/application/DataTableTool/src/CMakeLists.txt create mode 100644 engine/shared/application/DataTableTool/src/shared/DataTableTool.cpp create mode 100644 engine/shared/application/DataTableTool/src/shared/DataTableTool.h create mode 100644 engine/shared/application/DataTableTool/src/shared/FirstDataTableTool.cpp create mode 100644 engine/shared/application/DataTableTool/src/shared/FirstDataTableTool.h diff --git a/engine/shared/application/CMakeLists.txt b/engine/shared/application/CMakeLists.txt index d352bf1f..5c531127 100644 --- a/engine/shared/application/CMakeLists.txt +++ b/engine/shared/application/CMakeLists.txt @@ -1,3 +1,4 @@ +add_subdirectory(DataTableTool) add_subdirectory(TemplateCompiler) add_subdirectory(TemplateDefinitionCompiler) diff --git a/engine/shared/application/DataTableTool/CMakeLists.txt b/engine/shared/application/DataTableTool/CMakeLists.txt new file mode 100644 index 00000000..aae01564 --- /dev/null +++ b/engine/shared/application/DataTableTool/CMakeLists.txt @@ -0,0 +1,6 @@ + +cmake_minimum_required(VERSION 2.8) + +project(DataTableTool) + +add_subdirectory(src) diff --git a/engine/shared/application/DataTableTool/src/CMakeLists.txt b/engine/shared/application/DataTableTool/src/CMakeLists.txt new file mode 100644 index 00000000..93c041ec --- /dev/null +++ b/engine/shared/application/DataTableTool/src/CMakeLists.txt @@ -0,0 +1,58 @@ + +set(SHARED_SOURCES + shared/DataTableTool.cpp + shared/DataTableTool.h + shared/FirstDataTableTool.cpp + shared/FirstDataTableTool.h +) + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/shared + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedCompression/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedDebug/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedFile/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedFoundation/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedFoundationTypes/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedIoWin/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedMemoryManager/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedObject/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedRandom/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedRegex/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedTemplate/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedTemplateDefinition/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedThread/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedUtility/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedXml/include/public + ${SWG_EXTERNALS_SOURCE_DIR}/ours/library/archive/include + ${SWG_EXTERNALS_SOURCE_DIR}/ours/library/fileInterface/include/public + ${SWG_EXTERNALS_SOURCE_DIR}/ours/library/localization/include + ${SWG_EXTERNALS_SOURCE_DIR}/ours/library/unicode/include +) + +add_executable(DataTableTool + ${SHARED_SOURCES} +) + +target_link_libraries(DataTableTool + sharedCompression + sharedDebug + sharedFile + sharedFoundation + sharedIoWin + sharedMemoryManager + sharedObject + sharedRandom + sharedRegex + sharedTemplate + sharedTemplateDefinition + sharedThread + sharedUtility + sharedXml + archive + localization + localizationArchive + unicode + unicodeArchive + ${STLPORT_LIBRARIES} + ${CMAKE_DL_LIBS} +) diff --git a/engine/shared/application/DataTableTool/src/shared/DataTableTool.cpp b/engine/shared/application/DataTableTool/src/shared/DataTableTool.cpp new file mode 100644 index 00000000..19d88c66 --- /dev/null +++ b/engine/shared/application/DataTableTool/src/shared/DataTableTool.cpp @@ -0,0 +1,396 @@ +// ====================================================================== +// +// DataTableTool.cpp +// +// copyright 2002 Sony Online Entertainment +// +// ====================================================================== + +#include "FirstDataTableTool.h" +#include "DataTableTool.h" + +#include "sharedFoundation/CommandLine.h" +#include "sharedFoundation/ConfigFile.h" +#include "sharedFoundation/Crc.h" +#include "sharedFoundation/Os.h" +#include "sharedFoundation/SetupSharedFoundation.h" +#include "sharedThread/SetupSharedThread.h" +#include "sharedCompression/SetupSharedCompression.h" +#include "sharedDebug/SetupSharedDebug.h" +#include "sharedIoWin/SetupSharedIoWin.h" +#include "sharedFile/FileNameUtils.h" +#include "sharedFile/Iff.h" +#include "sharedFile/SetupSharedFile.h" +#include "sharedFile/TreeFile.h" + +#include "sharedUtility/DataTable.h" +#include "sharedUtility/DataTableManager.h" +#include "sharedUtility/DataTableWriter.h" + +#include "sharedXml/SetupSharedXml.h" + +#include +#include + +// ====================================================================== + +extern int main(int argc, char **argv); + +std::string DataTableTool::m_inputFile; +std::string DataTableTool::m_outputFile; +std::string DataTableTool::m_outputPath; + +// ====================================================================== +// command line stuff +// ====================================================================== + +static const char * const LNAME_HELP = "help"; +static const char * const LNAME_INPUT_FILE = "inputFile"; +static const char * const LNAME_OUTPUT_FILE = "outputFile"; +static const char * const LNAME_TEST = "test"; +static const char * const LNAME_P4EDIT = "edit"; +static const char * const LNAME_P4ADD = "add"; +static const char SNAME_HELP = 'h'; +static const char SNAME_INPUT_FILE = 'i'; +static const char SNAME_OUTPUT_FILE = 'o'; +static const char SNAME_TEST = 't'; +static const char SNAME_P4EDIT = 'e'; +static const char SNAME_P4ADD = 'a'; + + +static CommandLine::OptionSpec optionSpecArray[] = +{ + OP_BEGIN_SWITCH(OP_NODE_REQUIRED), + + // help + OP_SINGLE_SWITCH_NODE(SNAME_HELP, LNAME_HELP, OP_ARG_NONE, OP_MULTIPLE_DENIED), + + + // real options + OP_BEGIN_SWITCH_NODE(OP_MULTIPLE_DENIED), + OP_BEGIN_LIST(), + + // input file required + OP_SINGLE_LIST_NODE(SNAME_INPUT_FILE, LNAME_INPUT_FILE, OP_ARG_REQUIRED, OP_MULTIPLE_DENIED, OP_NODE_REQUIRED), + + // output file optional + OP_SINGLE_LIST_NODE(SNAME_OUTPUT_FILE, LNAME_OUTPUT_FILE, OP_ARG_REQUIRED, OP_MULTIPLE_DENIED, OP_NODE_OPTIONAL), + + // perforce operations + OP_SINGLE_LIST_NODE(SNAME_P4ADD, LNAME_P4ADD, OP_ARG_NONE, OP_MULTIPLE_DENIED, OP_NODE_OPTIONAL), + OP_SINGLE_LIST_NODE(SNAME_P4EDIT, LNAME_P4EDIT, OP_ARG_NONE, OP_MULTIPLE_DENIED, OP_NODE_OPTIONAL), + + // tests + OP_SINGLE_LIST_NODE(SNAME_TEST, LNAME_TEST, OP_ARG_NONE, OP_MULTIPLE_DENIED, OP_NODE_OPTIONAL), + + OP_END_LIST(), + OP_END_SWITCH_NODE(), + + + OP_END_SWITCH() +}; + +static const int optionSpecCount = sizeof(optionSpecArray) / sizeof(optionSpecArray[0]); + +// ====================================================================== + +int main(int argc, char **argv) +{ + //-- thread + SetupSharedThread::install(); + + //-- debug + SetupSharedDebug::install(4096); + + { + SetupSharedFoundation::Data data(SetupSharedFoundation::Data::D_console); + data.argc = argc; + data.argv = argv; +#if defined(PLATFORM_WIN32) + data.demoMode = true; +#endif +//Remove need for tools.cfg. You should include the path directly. This fixes the annoying warning that desigers get. +// data.configFile = "tools.cfg"; + SetupSharedFoundation::install(data); + } + + //-- file + SetupSharedCompression::install(); + SetupSharedFile::install(false); + DataTableManager::install(); + + //-- iowin + SetupSharedIoWin::install(); + + //-- XML + SetupSharedXml::install(); + + SetupSharedFoundation::callbackWithExceptionHandling(DataTableTool::run); + SetupSharedFoundation::remove(); + SetupSharedThread::remove(); + + return 0; +} + +// ---------------------------------------------------------------------- +void DataTableTool::run(void) +{ + //bool isXml = false; + int testOutput = 0; + + printf ("DataTable creation tool " __DATE__ " " __TIME__ "\n"); + // handle options + const CommandLine::MatchCode mc = CommandLine::parseOptions(optionSpecArray, optionSpecCount); + + if (mc != CommandLine::MC_MATCH) + { + printf("Invalid command line specified. Printing usage...\n"); + usage(); + return; + } + + if (CommandLine::getOccurrenceCount(SNAME_HELP)) + { + usage(); + return; + } + + m_inputFile = CommandLine::getOptionString(SNAME_INPUT_FILE); + + //isXml = DataTableWriter::isXmlFile(m_inputFile.c_str()); + + if (CommandLine::getOccurrenceCount(SNAME_OUTPUT_FILE)) + { + m_outputFile = CommandLine::getOptionString(SNAME_OUTPUT_FILE); + } + else + { + // Only convert the path + getDefaultOutputFileName(m_inputFile, m_outputPath, true); + removeFileName(m_outputPath); + } + + testOutput = CommandLine::getOccurrenceCount(SNAME_TEST); + + DataTableWriter dl; + dl.loadFromSpreadsheet(m_inputFile.c_str()); + + if (!m_outputFile.empty()) + { + createOutputDirectoryForFile(m_outputFile); + + if (!FileNameUtils::isWritable(m_outputFile)) + { + printf("ERROR: The output file is not available for writing: %s\n\n", m_outputFile.c_str()); + // todo: perforce edit??? + } + + bool success = dl.save( m_outputFile.c_str() ); + + printf("%s creating data table: %s\n", success ? "SUCCESS" : "FAILURE", m_outputFile.c_str()); + + // todo: perforce add + + if (testOutput) + runTest(m_outputFile.c_str()); + } + else + { + createOutputDirectoryForFile(m_outputPath); + dl.setOutputPath(m_outputPath.c_str()); + + std::vector tableNames; + dl.getTableNames(tableNames); + + std::vector::iterator i = tableNames.begin(); + for(; i != tableNames.end(); ++i) + { + std::string const & tableName = *i; + + std::string tableFileName; + dl.getTableOutputFileName( tableName.c_str(), tableFileName ); + + if (!FileNameUtils::isWritable(tableFileName)) + { + printf("ERROR: The output file is not available for writing: %s\n\n", tableFileName.c_str()); + continue; + // todo: perforce edit + } + + bool success = dl.saveTable( tableName.c_str(), tableFileName.c_str() ); + + printf("%s creating data table: %s\n", success ? "SUCCESS" : "FAILURE", tableFileName.c_str()); + + // todo: perforce add + + if (testOutput) + runTest(tableFileName.c_str()); + } + } + + if (testOutput) + getchar(); +} +// ---------------------------------------------------------------------- + +void DataTableTool::createOutputDirectoryForFile(const std::string & fileName) +{ + std::string::size_type slashPos = fileName.find_last_of('\\'); + if (slashPos == std::string::npos) + { + slashPos = fileName.find_last_of('/'); + if (slashPos == std::string::npos) + return; + } + + std::string directoryName(fileName, 0, slashPos); +#if defined(PLATFORM_WIN32) + int result = CreateDirectory(directoryName.c_str(), NULL); +#elif defined(PLATFORM_LINUX) + // make sure slashes are forward + { + std::string::size_type i; + while ((i = directoryName.find('\\')) != std::string::npos) + directoryName[i] = '/'; + } + int result = mkdir(directoryName.c_str(), 0777); +#else + #error unsupported platform +#endif + UNREF(result); +// DEBUG_FATAL(result == 0, ("Could not create directory %s from file %s", directoryName.c_str(), fileName.c_str())); +} + +// ---------------------------------------------------------------------- +void DataTableTool::getDefaultOutputFileName(const std::string & inputFileName, std::string & outputFileName, bool onlyConvertPath) +{ + char buffer [2048]; +#if defined(PLATFORM_WIN32) + char* tmp = 0; + int retval = GetFullPathName (inputFileName.c_str(), sizeof(buffer), buffer, &tmp); + FATAL(retval <= 0 || retval >= sizeof(buffer), ("Get FullPathName failed with %d", retval)); +#elif defined(PLATFORM_LINUX) + { + // make sure slashes are forward + std::string fileName = inputFileName; + std::string::size_type i; + while ((i = fileName.find('\\')) != std::string::npos) + fileName[i] = '/'; + char *retval = realpath(fileName.c_str(), buffer); + FATAL(!retval, ("realpath failed")); + } +#else + #error unsupported platform +#endif + outputFileName = buffer; + std::string::size_type dsrcPos = outputFileName.find("dsrc"); + FATAL (dsrcPos == std::string::npos, ("No output file specified and input file is not in the dsrc tree.")); + + outputFileName.replace(outputFileName.find("dsrc"), 4, "data"); + + if(!onlyConvertPath) + { + outputFileName.erase(outputFileName.find_last_of('.')); + outputFileName.append(".iff"); + } +} + +// ---------------------------------------------------------------------- + +void DataTableTool::removeFileName(std::string & outputFileName) +{ +#if defined(PLATFORM_WIN32) + outputFileName.erase(outputFileName.find_last_of('\\')); + outputFileName.append("\\"); +#elif defined(PLATFORM_LINUX) + outputFileName.erase(outputFileName.find_last_of('/')); + outputFileName.append("/"); +#else + #error unsupported platform +#endif +} + +// ---------------------------------------------------------------------- + +bool DataTableTool::runTest(const char * filename) +{ + int i = 0; + DataTable tester; + Iff newTest(filename, false); + tester.load(newTest); + + printf("Test 1....Numbers only ------------------------\n"); + for (i = 0; i < tester.getNumRows(); ++i) + { + printf("Row: %d ", i); + for (int j = 0; j < tester.getNumColumns(); ++j) + { + switch(tester.getDataTypeForColumn(j).getBasicType()) + { + case DataTableColumnType::DT_Int: + printf("%d ", tester.getIntValue(j,i)); + break; + case DataTableColumnType::DT_Float: + printf("%f ", tester.getFloatValue(j,i)); + break; + case DataTableColumnType::DT_String: + printf("%s ", tester.getStringValue(j,i)); + break; + default: + printf("??? "); + break; + } + } + printf("\n"); + + } + printf("\n"); + printf("Test 2....Using column names ----------------------\n"); + + std::vector colNames; + for (int numCols = 0; numCols < tester.getNumColumns(); ++numCols) + { + colNames.push_back(tester.getColumnName(numCols)); + } + for (i = 0; i < tester.getNumRows(); ++i) + { + printf("Row: %d ", i); + for (int j = 0; j < tester.getNumColumns(); ++j) + { + switch(tester.getDataTypeForColumn(colNames[j]).getBasicType()) + { + case DataTableColumnType::DT_Int: + printf("%d ", tester.getIntValue(colNames[j],i)); + break; + case DataTableColumnType::DT_Float: + printf("%f ", tester.getFloatValue(colNames[j],i)); + break; + case DataTableColumnType::DT_String: + printf("%s ", tester.getStringValue(colNames[j],i)); + break; + default: + printf("??? "); + break; + } + } + printf("\n"); + + } + printf("\n"); + return true; +} + + +void DataTableTool::usage(void) +{ + printf("DataTableTool -i \n"); + printf("Optional Parameters: \n"); + printf(" -h print this stuff \n"); + printf(" -o specify output file name. (By default it uses the inputfile name but \n"); + printf(" it replaces the dsrc directory with data and the extension with .iff)\n"); + printf(" For XML files, this option is not valid.\n"); + printf(" -t run diagnotic test \n"); + getchar(); +} + +// ====================================================================== diff --git a/engine/shared/application/DataTableTool/src/shared/DataTableTool.h b/engine/shared/application/DataTableTool/src/shared/DataTableTool.h new file mode 100644 index 00000000..99b61079 --- /dev/null +++ b/engine/shared/application/DataTableTool/src/shared/DataTableTool.h @@ -0,0 +1,47 @@ +// ====================================================================== +// +// DataTableTool.h +// +// copyright 2002 Sony Online Entertainment +// +// ====================================================================== + +#ifndef INCLUDED_DataTableTool_H +#define INCLUDED_DataTableTool_H + +// ====================================================================== + +#include + +class DataTableTool +{ +private: + + DataTableTool(void); + DataTableTool(const DataTableTool&); + DataTableTool &operator =(const DataTableTool&); + +public: + + DataTableTool(const char *fileName); + ~DataTableTool(void); + + static void run(); + static void usage(); + +private: + static void createOutputDirectoryForFile(const std::string & fileName); + static void getDefaultOutputFileName(const std::string & inputFileName, std::string & outputFileName, bool onlyConvertPath); + static void removeFileName(std::string & outputFileName); + + static std::string m_inputFile; + static std::string m_outputFile; + static std::string m_outputPath; + + static bool runTest(const char * filename); + +}; + +// ====================================================================== + +#endif diff --git a/engine/shared/application/DataTableTool/src/shared/FirstDataTableTool.cpp b/engine/shared/application/DataTableTool/src/shared/FirstDataTableTool.cpp new file mode 100644 index 00000000..ad73f1e5 --- /dev/null +++ b/engine/shared/application/DataTableTool/src/shared/FirstDataTableTool.cpp @@ -0,0 +1 @@ +#include "FirstDataTableTool.h" diff --git a/engine/shared/application/DataTableTool/src/shared/FirstDataTableTool.h b/engine/shared/application/DataTableTool/src/shared/FirstDataTableTool.h new file mode 100644 index 00000000..f3f86deb --- /dev/null +++ b/engine/shared/application/DataTableTool/src/shared/FirstDataTableTool.h @@ -0,0 +1 @@ +#include "sharedFoundation/FirstSharedFoundation.h"