Fixing SuperTux crashes when compiled on Mac OS X 10.9
[supertux.git] / src / supertux / world.cpp
index f136098..d1fe91e 100644 (file)
@@ -18,7 +18,7 @@
 
 #include "lisp/parser.hpp"
 #include "lisp/writer.hpp"
-#include "physfs/ifile_stream.hpp"
+#include "physfs/ifile_streambuf.hpp"
 #include "scripting/serialize.hpp"
 #include "scripting/squirrel_util.hpp"
 #include "supertux/globals.hpp"
@@ -65,7 +65,7 @@ World::set_savegame_filename(const std::string& filename)
   // make sure the savegame directory exists
   std::string dirname = FileSystem::dirname(filename);
   if(!PHYSFS_exists(dirname.c_str())) {
-    if(PHYSFS_mkdir(dirname.c_str())) {
+    if(!PHYSFS_mkdir(dirname.c_str())) {
       std::ostringstream msg;
       msg << "Couldn't create directory for savegames '"
           << dirname << "': " <<PHYSFS_getLastError();
@@ -143,7 +143,8 @@ World::run()
 
   std::string filename = basedir + "/world.nut";
   try {
-    IFileStream in(filename);
+    IFileStreambuf ins(filename);
+    std::istream in(&ins);
 
     sq_release(global_vm, &world_thread);
     world_thread = create_thread(global_vm);
@@ -197,41 +198,43 @@ World::load_state()
 {
   using namespace scripting;
 
-  try {
-    lisp::Parser parser;
-    const lisp::Lisp* root = parser.parse(savegame_filename);
-
-    const lisp::Lisp* lisp = root->get_lisp("supertux-savegame");
-    if(lisp == NULL)
-      throw std::runtime_error("file is not a supertux-savegame file");
-
-    int version = 1;
-    lisp->get("version", version);
-    if(version != 1)
-      throw std::runtime_error("incompatible savegame version");
-
-    const lisp::Lisp* tux = lisp->get_lisp("tux");
-    if(tux == NULL)
-      throw std::runtime_error("No tux section in savegame");
-    player_status->read(*tux);
-
-    const lisp::Lisp* state = lisp->get_lisp("state");
-    if(state == NULL)
-      throw std::runtime_error("No state section in savegame");
-
-    sq_pushroottable(global_vm);
-    sq_pushstring(global_vm, "state", -1);
-    if(SQ_FAILED(sq_deleteslot(global_vm, -2, SQFalse)))
+  if(PHYSFS_exists(savegame_filename.c_str())) {
+    try {
+      lisp::Parser parser;
+      const lisp::Lisp* root = parser.parse(savegame_filename);
+
+      const lisp::Lisp* lisp = root->get_lisp("supertux-savegame");
+      if(lisp == NULL)
+        throw std::runtime_error("file is not a supertux-savegame file");
+
+      int version = 1;
+      lisp->get("version", version);
+      if(version != 1)
+        throw std::runtime_error("incompatible savegame version");
+
+      const lisp::Lisp* tux = lisp->get_lisp("tux");
+      if(tux == NULL)
+        throw std::runtime_error("No tux section in savegame");
+      player_status->read(*tux);
+
+      const lisp::Lisp* state = lisp->get_lisp("state");
+      if(state == NULL)
+        throw std::runtime_error("No state section in savegame");
+
+      sq_pushroottable(global_vm);
+      sq_pushstring(global_vm, "state", -1);
+      if(SQ_FAILED(sq_deleteslot(global_vm, -2, SQFalse)))
+        sq_pop(global_vm, 1);
+
+      sq_pushstring(global_vm, "state", -1);
+      sq_newtable(global_vm);
+      load_squirrel_table(global_vm, -1, *state);
+      if(SQ_FAILED(sq_createslot(global_vm, -3)))
+        throw std::runtime_error("Couldn't create state table");
       sq_pop(global_vm, 1);
-
-    sq_pushstring(global_vm, "state", -1);
-    sq_newtable(global_vm);
-    load_squirrel_table(global_vm, -1, *state);
-    if(SQ_FAILED(sq_createslot(global_vm, -3)))
-      throw std::runtime_error("Couldn't create state table");
-    sq_pop(global_vm, 1);
-  } catch(std::exception& e) {
-    log_debug << "Couldn't load savegame: " << e.what() << std::endl;
+    } catch(std::exception& e) {
+      log_fatal << "Couldn't load savegame: " << e.what() << std::endl;
+    }
   }
 }