diff utils/dat_extract/main.cpp @ 0:4a0efb7baf70

* Datasets becomes the new trunk and retires after that :-)
author mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222
date Sun, 29 Jun 2008 18:44:17 +0000
parents
children 90005975cdbb
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/utils/dat_extract/main.cpp	Sun Jun 29 18:44:17 2008 +0000
@@ -0,0 +1,150 @@
+/***************************************************************************
+*   Copyright (C) 2005-2007 by the FIFE Team                              *
+*   fife-public@lists.sourceforge.net                                     *
+*   This file is part of FIFE.                                            *
+*                                                                         *
+*   FIFE is free software; you can redistribute it and/or modify          *
+*   it under the terms of the GNU General Public License as published by  *
+*   the Free Software Foundation; either version 2 of the License, or     *
+*   (at your option) any later version.                                   *
+*                                                                         *
+*   This program is distributed in the hope that it will be useful,       *
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+*   GNU General Public License for more details.                          *
+*                                                                         *
+*   You should have received a copy of the GNU General Public License     *
+*   along with this program; if not, write to the                         *
+*   Free Software Foundation, Inc.,                                       *
+*   51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA              *
+***************************************************************************/
+
+// Standard C++ library includes
+#include <cassert>
+#include <iostream>
+#include <string>
+
+// Platform dependent includes
+#include <iostream>
+#ifndef __WIN32
+#include <libgen.h>
+#else
+#include <getopt.h>
+#endif
+
+// 3rd party library includes
+
+// FIFE includes
+// These includes are split up in two parts, separated by one empty line
+// First block: files included from the FIFE root src directory
+// Second block: files included from the same folder
+#include "loaders/fallout/vfs_loaders/dat1.h"
+#include "loaders/fallout/vfs_loaders/dat2.h"
+#include "vfs/raw/rawdata.h"
+#include "vfs/vfshostsystem.h"
+#include "vfs/vfssourcefactory.h"
+#include "controller/engine.h"
+#include "util/base/exception.h"
+#include "util/settingsmanager.h"
+
+using namespace FIFE;
+
+extern int print_usage(const char* prg_name, int exit_code);
+
+int main(int argc, char* argv[]) {
+	Engine* engine = NULL;
+	VFS* vfs = NULL;
+	RawDataPtr rd;
+	std::string src_file("critter.dat");
+	std::string target_file("");
+	int fo_format = 1;
+	int c;
+
+	while ((c = getopt (argc, argv, "f:s:t:h")) != -1)
+		switch(c) {
+			case 'f':
+				fo_format = atoi(optarg);
+				break;
+			case 's':
+				src_file = std::string(optarg);
+				break;
+			case 't':
+				target_file = std::string(optarg);
+				break;
+			case 'h':
+				print_usage(argv[0], 0);
+		}
+
+	char *argv_fake[1] = {argv[0]};
+	try {
+		engine = new Engine(true);
+	}
+
+	catch (const Exception& exception) {
+		std::cerr << "Error: could not start engine: " << exception.getMessage() << std::endl;
+	}
+
+	if (src_file.length() == 0) {
+		std::cout << "Invalid DAT source file"; 
+		print_usage(argv[0], 1);
+	}
+
+	if (target_file.length() == 0) {
+		std::cout << "Invalid target file to extract";
+		print_usage(argv[0], 1);
+	}
+
+	if (!(fo_format == 1 || fo_format == 2)) {
+		std::cout << "Unknown format " << fo_format;
+		print_usage(argv[0], 1);
+	}
+
+	try {
+		VFSSourceFactory::instance();
+		vfs = VFS::instance();
+		vfs->addSource(new VFSHostSystem());
+
+		if (vfs->exists(src_file)) {
+			if (fo_format == 1) {
+				vfs->addSource(new map::loaders::fallout::DAT1(src_file));
+			} else {
+				vfs->addSource(new map::loaders::fallout::DAT2(src_file));
+			}
+		} else {
+			throw NotFound(src_file);
+		}
+
+		if (!vfs->exists(target_file)) {
+			throw NotFound(target_file);
+		}
+
+		rd = vfs->open(target_file);
+
+		int len = rd->getDataLength();
+		uint8_t * buf = new uint8_t[len];
+		rd->readInto(buf, len);
+
+		std::string target_filename(target_file);
+		if (target_file.find("/") != std::string::npos) {
+		target_filename.assign(target_file, target_file.rfind("/") + 1,
+			target_file.length() - target_file.rfind("/") - 1);
+		}
+
+		FILE* out_fd = fopen(target_filename.c_str(), "wb");
+		assert(out_fd);
+		fwrite(buf, sizeof(uint8_t), len, out_fd);
+		fclose(out_fd);
+
+		delete buf;
+	}
+
+	catch (const Exception& exception) {
+		std::cerr << "exception: " << exception.getMessage() << std::endl;
+		return 1;
+	}
+
+	if (engine) {
+		delete engine;
+	}
+}
+/* vim: set noexpandtab: set shiftwidth=2: set tabstop=2: */