299 lines
7 KiB
C++
299 lines
7 KiB
C++
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#include "nel/misc/types_nl.h"
|
|
#include "nel/misc/path.h"
|
|
#include "nel/misc/sheet_id.h"
|
|
#include <stdio.h>
|
|
#include <vector>
|
|
#include "game_share/persistent_data.h"
|
|
|
|
using namespace std;
|
|
using namespace NLMISC;
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
NLMISC::CApplicationContext context;
|
|
|
|
if (argc == 1)
|
|
{
|
|
printf("Usage : %s [-s<sheet_id_path>] [-x|-b|-t] [-o<outputFileName>] inputFileName\n", argv[0]);
|
|
printf(" -s : must contains the path where the sheet_id.bin can be found\n");
|
|
printf(" You could ignore this param is the sheet_id.bin can be found in the local directory\n");
|
|
printf(" -x : convert a binary pdr to XML format (exclude -b -t)\n");
|
|
printf(" -t : convert a binary pdr to text line format (exclude -b -x)\n");
|
|
printf(" -b : convert a XML or text pdr to binary format (exclude -x -t)\n");
|
|
printf(" -o : output filename\n");
|
|
return -1;
|
|
}
|
|
|
|
enum TConvMode
|
|
{
|
|
cm_undefined,
|
|
cm_to_xml,
|
|
cm_to_binary,
|
|
cm_to_txt,
|
|
};
|
|
|
|
enum TSourceFormat
|
|
{
|
|
sf_undefined,
|
|
sf_xml,
|
|
sf_txt
|
|
};
|
|
|
|
TConvMode mode = cm_undefined;
|
|
TSourceFormat sourceFormat = sf_undefined;
|
|
string sheetIdPath;
|
|
string fileName;
|
|
vector<string> filenames;
|
|
string outputFileName;
|
|
|
|
vector<string> args(argv, argv+argc);
|
|
|
|
for (uint i=1; i<args.size(); ++i)
|
|
{
|
|
if (args[i].size() >= 2 && args[i][0] == '-')
|
|
{
|
|
string paramValue = args[i].substr(2);
|
|
|
|
switch (args[i][1])
|
|
{
|
|
case 's':
|
|
sheetIdPath = paramValue;
|
|
break;
|
|
case 'x':
|
|
mode = cm_to_xml;
|
|
break;
|
|
case 't':
|
|
mode = cm_to_txt;
|
|
break;
|
|
case 'b':
|
|
mode = cm_to_binary;
|
|
break;
|
|
case 'o':
|
|
outputFileName = paramValue;
|
|
break;
|
|
default:
|
|
fprintf(stderr, "Unknown parameter '%s'", args[i].c_str());
|
|
return -1;
|
|
}
|
|
}
|
|
else if(!args[i].empty())
|
|
{
|
|
filenames.push_back(args[i]);
|
|
}
|
|
/*
|
|
if (i == args.size()-1)
|
|
{
|
|
// last param, must be the filename
|
|
if (args[i].empty() || args[i][0] == '-')
|
|
{
|
|
fprintf(stderr, "Invalid or missing filename '%s'\n", args[i].c_str());
|
|
return -1;
|
|
}
|
|
|
|
fileName = args[i];
|
|
}
|
|
else
|
|
{
|
|
if (args[i].empty() || args[i][0] != '-' || args[i].size() < 2)
|
|
{
|
|
fprintf(stderr, "Invalid param '%s'\n", args[i].c_str());
|
|
return -1;
|
|
}
|
|
|
|
string paramValue = args[i].substr(2);
|
|
|
|
switch (args[i][1])
|
|
{
|
|
case 's':
|
|
sheetIdPath = paramValue;
|
|
break;
|
|
case 'x':
|
|
mode = cm_to_xml;
|
|
break;
|
|
case 't':
|
|
mode = cm_to_txt;
|
|
break;
|
|
case 'b':
|
|
mode = cm_to_binary;
|
|
break;
|
|
case 'o':
|
|
outputFileName = paramValue;
|
|
default:
|
|
fprintf(stderr, "Unknown parameter '%s'", args[i].c_str());
|
|
return -1;
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
// init the sheet id
|
|
if (!sheetIdPath.empty())
|
|
{
|
|
CPath::addSearchPath(sheetIdPath, false, false);
|
|
}
|
|
|
|
CSheetId::init(false);
|
|
|
|
for(uint f = 0; f < filenames.size(); f++)
|
|
{
|
|
fileName = filenames[f];
|
|
|
|
if (!CFile::isExists(fileName))
|
|
{
|
|
fprintf(stderr, "Couldn't find file '%s'", fileName.c_str());
|
|
// return -1;
|
|
continue;
|
|
}
|
|
|
|
if (mode == cm_undefined)
|
|
{
|
|
// try to automatically determine conversion mode
|
|
if (fileName.find(".xml") == (fileName.size() - 4))
|
|
{
|
|
printf("Choosing XML->BINARY conversion mode");
|
|
mode = cm_to_binary;
|
|
}
|
|
else if (fileName.find(".txt") == (fileName.size() -4))
|
|
{
|
|
printf("Choosing TXT->BINARY conversion mode");
|
|
mode = cm_to_binary;
|
|
}
|
|
else if (fileName.find(".bin") == (fileName.size() -4))
|
|
{
|
|
printf("Choosing BINARY->XML conversion mode");
|
|
mode = cm_to_xml;
|
|
}
|
|
else
|
|
{
|
|
fprintf(stderr, "Missing conversion mode flag (-x|-b|-t) and can't deduce mode from filename extension");
|
|
// return -1;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
// determine source format when concerting to binary
|
|
if (mode == cm_to_binary)
|
|
{
|
|
if (fileName.find(".xml") == (fileName.size() - 4))
|
|
{
|
|
printf("Source file is in XML format");
|
|
sourceFormat = sf_xml;
|
|
}
|
|
/* else if (fileName.find(".txt") == (fileName.size() -4))
|
|
{
|
|
printf("Source file is in TXT format");
|
|
sourceFormat = sf_txt;
|
|
}
|
|
*/ else
|
|
{
|
|
fprintf(stderr, "Invalid source format, only support '.xml' files");
|
|
// return -1;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if (outputFileName.empty() || filenames.size() > 1)
|
|
{
|
|
// build a output name
|
|
outputFileName = fileName;
|
|
string inExt;
|
|
string outExt;
|
|
|
|
if (mode == cm_to_binary)
|
|
{
|
|
if (sourceFormat == sf_txt)
|
|
inExt = ".txt";
|
|
else
|
|
inExt = ".xml";
|
|
outExt = ".bin";
|
|
}
|
|
else if (mode == cm_to_xml)
|
|
{
|
|
outExt = ".xml";
|
|
inExt = ".bin";
|
|
}
|
|
else if (mode == cm_to_txt)
|
|
{
|
|
outExt = ".txt";
|
|
inExt = ".bin";
|
|
}
|
|
|
|
if (outputFileName.find(inExt) == (outputFileName.size()-inExt.size()))
|
|
{
|
|
// remove input ext from output filename
|
|
outputFileName = outputFileName.substr(0, outputFileName.size()-inExt.size());
|
|
}
|
|
// append output extension
|
|
outputFileName += outExt;
|
|
}
|
|
|
|
static CPersistentDataRecord pdr;
|
|
pdr.clear();
|
|
|
|
switch(mode)
|
|
{
|
|
case cm_to_binary:
|
|
if (sourceFormat == sf_txt)
|
|
{
|
|
printf("Converting from txt to bin is currently unpossible ! use xml format");
|
|
// return -1;
|
|
continue;
|
|
// printf("Converting '%s' (TXT) to '%s' (BINARY)\n", fileName.c_str(), outputFileName.c_str() );
|
|
}
|
|
else
|
|
printf("Converting '%s' (XML) to '%s' (BINARY)\n", fileName.c_str(), outputFileName.c_str() );
|
|
if (!pdr.readFromTxtFile(fileName))
|
|
goto failureRead;
|
|
if (!pdr.writeToBinFile(outputFileName))
|
|
goto failureWrite;
|
|
break;
|
|
|
|
case cm_to_xml:
|
|
printf("Converting '%s' (BINARY) to '%s' (XML)\n", fileName.c_str(), outputFileName.c_str() );
|
|
if (!pdr.readFromBinFile(fileName))
|
|
goto failureRead;
|
|
if (!pdr.writeToTxtFile(outputFileName, CPersistentDataRecord::XML_STRING))
|
|
goto failureWrite;
|
|
break;
|
|
|
|
case cm_to_txt:
|
|
printf("Converting '%s' (BINARY) to '%s' (TXT)\n", fileName.c_str(), outputFileName.c_str() );
|
|
if (!pdr.readFromBinFile(fileName))
|
|
goto failureRead;
|
|
if (!pdr.writeToTxtFile(outputFileName, CPersistentDataRecord::LINES_STRING))
|
|
goto failureWrite;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
// return 0;
|
|
continue;
|
|
|
|
failureRead:
|
|
fprintf(stderr, "Error while reading '%s', conversion aborted", fileName.c_str());
|
|
// return -1;
|
|
continue;
|
|
failureWrite:
|
|
fprintf(stderr, "Error while writing '%s', conversion aborted", outputFileName.c_str());
|
|
// return -1;
|
|
continue;
|
|
}
|
|
|
|
}
|