// $Id$
//
-// TuxKart - a fun racing game with go-kart
-// Copyright (C) 2004 Matthias Braun <matze@braunis.de>
-// code in this file based on lispreader from Mark Probst
+// SuperTux
+// Copyright (C) 2006 Matthias Braun <matze@braunis.de>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
#include <config.h>
#include <sstream>
#include <cassert>
#include <iostream>
-#include "tinygettext/tinygettext.h"
-#include "parser.h"
-#include "lisp.h"
-#include "file_system.h"
+#include "tinygettext/tinygettext.hpp"
+#include "physfs/physfs_stream.hpp"
+#include "parser.hpp"
+#include "lisp.hpp"
namespace lisp
{
{
if(translate) {
dictionary_manager = new TinyGetText::DictionaryManager();
- dictionary_manager->set_charset("ISO8859-1");
+ dictionary_manager->set_charset("UTF-8");
}
}
delete dictionary_manager;
}
+static std::string dirname(std::string filename)
+{
+ std::string::size_type p = filename.find_last_of('/');
+ if(p == std::string::npos)
+ return "";
+
+ return filename.substr(0, p+1);
+}
+
Lisp*
Parser::parse(const std::string& filename)
{
- std::ifstream in(filename.c_str());
+ IFileStream in(filename);
if(!in.good()) {
std::stringstream msg;
msg << "Parser problem: Couldn't open file '" << filename << "'.";
}
if(dictionary_manager) {
- dictionary_manager->add_directory(FileSystem::dirname(filename));
+ dictionary_manager->add_directory(dirname(filename));
dictionary = & (dictionary_manager->get_dictionary());
}
-
+
return parse(in);
}
Lisp* result = new Lisp(Lisp::TYPE_CONS);
result->v.cons.car = read();
result->v.cons.cdr = 0;
-
+
delete lexer;
lexer = 0;
- return result;
+ return result;
}
Lisp*
}
case Lexer::TOKEN_OPEN_PAREN: {
result = new Lisp(Lisp::TYPE_CONS);
-
+
token = lexer->getNextToken();
if(token == Lexer::TOKEN_CLOSE_PAREN) {
result->v.cons.car = 0;
// evaluate translation function (_ str) in place here
token = lexer->getNextToken();
if(token != Lexer::TOKEN_STRING)
- throw new std::runtime_error("Expected string after '(_'");
-
+ throw std::runtime_error("Expected string after '(_'");
+
result = new Lisp(Lisp::TYPE_STRING);
if(dictionary) {
std::string translation = dictionary->translate(lexer->getString());
result->v.string = new char[translation.size()+1];
memcpy(result->v.string, translation.c_str(), translation.size()+1);
} else {
- size_t len = strlen(lexer->getString()) + 1;
+ size_t len = strlen(lexer->getString()) + 1;
result->v.string = new char[len];
memcpy(result->v.string, lexer->getString(), len);
}
token = lexer->getNextToken();
if(token != Lexer::TOKEN_CLOSE_PAREN)
- throw new std::runtime_error("Expected ')' after '(_ string'");
+ throw std::runtime_error("Expected ')' after '(_ string'");
break;
}