[Change] Huge changes to Lephisto's data management.
This commit is contained in:
		
							parent
							
								
									82a82ed70e
								
							
						
					
					
						commit
						05398e71d2
					
				
							
								
								
									
										11
									
								
								src/ai.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/ai.c
									
									
									
									
									
								
							@ -58,7 +58,7 @@
 | 
			
		||||
#include "pilot.h"
 | 
			
		||||
#include "player.h"
 | 
			
		||||
#include "physics.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "rng.h"
 | 
			
		||||
#include "space.h"
 | 
			
		||||
#include "faction.h"
 | 
			
		||||
@ -387,7 +387,7 @@ int ai_init(void) {
 | 
			
		||||
  uint32_t nfiles, i;
 | 
			
		||||
 | 
			
		||||
  /* Get the file list. */
 | 
			
		||||
  files = pack_listfiles(data, &nfiles);
 | 
			
		||||
  files = ldata_list(AI_PREFIX, &nfiles);
 | 
			
		||||
 | 
			
		||||
  /* Load the profiles. */
 | 
			
		||||
  for(i = 0; i < nfiles; i++)
 | 
			
		||||
@ -399,11 +399,6 @@ int ai_init(void) {
 | 
			
		||||
      if(ai_loadProfile(files[i])) /* Load the profiles. */
 | 
			
		||||
        WARN("Error loading AI profile '%s'", files[i]);
 | 
			
		||||
 | 
			
		||||
  /* Free the char allocated by pack. */
 | 
			
		||||
  for(i = 0; i < nfiles; i++)
 | 
			
		||||
    free(files[i]);
 | 
			
		||||
  free(files);
 | 
			
		||||
 | 
			
		||||
  DEBUG("Loaded %d AI profile%c", nprofiles, (nprofiles==1)?' ':'s');
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
@ -456,7 +451,7 @@ static int ai_loadProfile(char* filename) {
 | 
			
		||||
  lua_loadVector(L);
 | 
			
		||||
 | 
			
		||||
  /* Now load the file, since all the functions have been previously loaded. */
 | 
			
		||||
  buf = pack_readfile(DATA, filename, &bufsize);
 | 
			
		||||
  buf = ldata_read(filename, &bufsize);
 | 
			
		||||
  if(luaL_dobuffer(L, buf, bufsize, filename) != 0) {
 | 
			
		||||
    ERR("Error loading AI file: %s\n"
 | 
			
		||||
        "%s\n"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										43
									
								
								src/conf.c
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								src/conf.c
									
									
									
									
									
								
							@ -13,7 +13,7 @@
 | 
			
		||||
#include "input.h"
 | 
			
		||||
#include "music.h"
 | 
			
		||||
#include "nebulae.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "lfile.h"
 | 
			
		||||
#include "conf.h"
 | 
			
		||||
 | 
			
		||||
@ -85,32 +85,6 @@ static void print_usage(char** argv) {
 | 
			
		||||
 * @brief Set the default configuration.
 | 
			
		||||
 */
 | 
			
		||||
void conf_setDefaults(void) {
 | 
			
		||||
  int i, nfiles;
 | 
			
		||||
  char** files;
 | 
			
		||||
  size_t len;
 | 
			
		||||
 | 
			
		||||
  /* Find data. */
 | 
			
		||||
  if(lfile_fileExists("%s-%d.%d.%d", DATA_NAME, VMAJOR, VMINOR, VREV)) {
 | 
			
		||||
    data = malloc(PATH_MAX);
 | 
			
		||||
    snprintf(data, PATH_MAX, "%s-%d.%d.%d", DATA_NAME, VMAJOR, VMINOR, VREV);
 | 
			
		||||
  } else if(lfile_fileExists(DATA_DEF))
 | 
			
		||||
    data = DATA_DEF;
 | 
			
		||||
  else {
 | 
			
		||||
    files = lfile_readDir(&nfiles, ".");
 | 
			
		||||
    len = strlen(DATA_NAME);
 | 
			
		||||
    for(i = 0; i < nfiles; i++) {
 | 
			
		||||
      if(strncmp(files[i], DATA_NAME, len) == 0) {
 | 
			
		||||
        /* Must be packfile. */
 | 
			
		||||
        if(pack_check(files[i]))
 | 
			
		||||
          continue;
 | 
			
		||||
 | 
			
		||||
        data = strdup(files[i]);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    for(i = 0; i < nfiles; i++)
 | 
			
		||||
      free(files[i]);
 | 
			
		||||
    free(files);
 | 
			
		||||
  }
 | 
			
		||||
  /* GL. */
 | 
			
		||||
  gl_screen.w = 800;
 | 
			
		||||
  gl_screen.h = 600;
 | 
			
		||||
@ -142,7 +116,10 @@ int conf_loadConfig(const char* file) {
 | 
			
		||||
  if(luaL_dofile(L, file) == 0) {
 | 
			
		||||
    /* Conf file exists indeed. */
 | 
			
		||||
    /* Global. */
 | 
			
		||||
    conf_loadString("data", data);
 | 
			
		||||
    lua_getglobal(L, "data");
 | 
			
		||||
    if(lua_isstring(L, -1))
 | 
			
		||||
      ldata_setPath((char*)lua_tostring(L, -1));
 | 
			
		||||
    lua_remove(L, -1);
 | 
			
		||||
 | 
			
		||||
    /* OpenGL properties.. */
 | 
			
		||||
 | 
			
		||||
@ -212,14 +189,12 @@ int conf_loadConfig(const char* file) {
 | 
			
		||||
 | 
			
		||||
    /* Joystick. */
 | 
			
		||||
    lua_getglobal(L, "joystick");
 | 
			
		||||
    if(lua_isnumber(L, -1)) {
 | 
			
		||||
    if(lua_isnumber(L, -1))
 | 
			
		||||
      indjoystick = (int)lua_tonumber(L, -1);
 | 
			
		||||
      lua_remove(L, -1);
 | 
			
		||||
    }
 | 
			
		||||
    else if(lua_isstring(L, -1)) {
 | 
			
		||||
    else if(lua_isstring(L, -1))
 | 
			
		||||
      namjoystick = strdup((char*)lua_tostring(L, -1));
 | 
			
		||||
 | 
			
		||||
    lua_remove(L, -1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Keybindings. */
 | 
			
		||||
    for(i = 0; strcmp(keybindNames[i], "end"); i++) {
 | 
			
		||||
@ -362,7 +337,7 @@ void conf_parseCLI(int argc, char** argv) {
 | 
			
		||||
      gl_screen.flags |= OPENGL_VSYNC;
 | 
			
		||||
      break;
 | 
			
		||||
    case 'd':
 | 
			
		||||
      data = strdup(optarg);
 | 
			
		||||
      ldata_setPath(optarg);
 | 
			
		||||
      break;
 | 
			
		||||
    case 'j':
 | 
			
		||||
      indjoystick = atoi(optarg);
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@
 | 
			
		||||
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "lxml.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "spfx.h"
 | 
			
		||||
#include "pilot.h"
 | 
			
		||||
@ -154,7 +154,7 @@ void commodity_Jettison(int pilot, Commodity* com, int quantity) {
 | 
			
		||||
/* Init/exit */
 | 
			
		||||
int commodity_load(void) {
 | 
			
		||||
  uint32_t bufsize;
 | 
			
		||||
  char* buf = pack_readfile(DATA, COMMODITY_DATA, &bufsize);
 | 
			
		||||
  char* buf = ldata_read(COMMODITY_DATA, &bufsize);
 | 
			
		||||
 | 
			
		||||
  xmlNodePtr node;
 | 
			
		||||
  xmlDocPtr doc = xmlParseMemory(buf, bufsize);
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@
 | 
			
		||||
#include "opengl.h"
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "lxml.h"
 | 
			
		||||
#include "rng.h"
 | 
			
		||||
#include "faction.h"
 | 
			
		||||
@ -548,7 +548,7 @@ void factions_reset(void) {
 | 
			
		||||
int factions_load(void) {
 | 
			
		||||
  int mem;
 | 
			
		||||
  uint32_t bufsize;
 | 
			
		||||
  char* buf = pack_readfile(DATA, FACTION_DATA, &bufsize);
 | 
			
		||||
  char* buf = ldata_read(FACTION_DATA, &bufsize);
 | 
			
		||||
 | 
			
		||||
  xmlNodePtr factions, node;
 | 
			
		||||
  xmlDocPtr doc = xmlParseMemory(buf, bufsize);
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,7 @@
 | 
			
		||||
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
 | 
			
		||||
#define FONT_DEF  "../dat/font.ttf" /**< Default font path. */
 | 
			
		||||
 | 
			
		||||
@ -523,7 +523,7 @@ void gl_fontInit(glFont* font, const char* fname, const unsigned int h) {
 | 
			
		||||
 | 
			
		||||
  if(font == NULL) font = &gl_defFont;
 | 
			
		||||
 | 
			
		||||
  FT_Byte* buf = pack_readfile(DATA, (fname!=NULL) ? fname : FONT_DEF, &bufsize);
 | 
			
		||||
  FT_Byte* buf = ldata_read((fname != NULL) ? fname : FONT_DEF, &bufsize);
 | 
			
		||||
 | 
			
		||||
  /* Allocatagery. */
 | 
			
		||||
  font->textures = malloc(sizeof(GLuint)*128);
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@
 | 
			
		||||
#include "SDL.h"
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "font.h"
 | 
			
		||||
#include "music.h"
 | 
			
		||||
#include "intro.h"
 | 
			
		||||
@ -33,7 +33,7 @@ static int intro_load(void) {
 | 
			
		||||
  int i, p, n;
 | 
			
		||||
  int mem;
 | 
			
		||||
 | 
			
		||||
  intro_buf = pack_readfile(DATA, "../dat/intro", &intro_size);
 | 
			
		||||
  intro_buf = ldata_read("../dat/intro", &intro_size);
 | 
			
		||||
  intro_length = intro_size; /* Length aproximation! */
 | 
			
		||||
 | 
			
		||||
  /* Create intro font. */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										198
									
								
								src/ldata.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								src/ldata.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,198 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @file ldata.c
 | 
			
		||||
 *
 | 
			
		||||
 * @brief Wrapper to handle reading/writing the ldata file.
 | 
			
		||||
 *
 | 
			
		||||
 * Optimizes to minimize the opens and frees, plus tries to read from the
 | 
			
		||||
 * filesystem instead of always looking for a packfile.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "md5.h"
 | 
			
		||||
#include "lxml.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "lfile.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
 | 
			
		||||
#define LDATA_FILENAME  "ldata"
 | 
			
		||||
#define LDATA_DEF       "ldata"
 | 
			
		||||
 | 
			
		||||
#define XML_START_ID    "Start" /**< XML document tag of module start file. */
 | 
			
		||||
#define START_DATA      "../dat/start.xml" /**< Path to module start file. */
 | 
			
		||||
 | 
			
		||||
/* Packfile. */
 | 
			
		||||
static char* ldata_filename   = NULL; /**< Packfile name. */
 | 
			
		||||
static Packfile_t* ldata_pack = NULL; /**< Actual packfile. */
 | 
			
		||||
static char* ldata_packName   = NULL; /**< Name of the ldata module. */
 | 
			
		||||
 | 
			
		||||
/* File list. */
 | 
			
		||||
static char** ldata_fileList    = NULL; /**< List of the files in the packfile. */
 | 
			
		||||
static uint32_t ldata_fileNList = 0;    /**< Number of files in ldata_fileList. */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Check to see if path is a ldata file.
 | 
			
		||||
 *    @param path Path to check to see if it's an ldata file.
 | 
			
		||||
 *    @return 1 if it is an ldata file, otherwise 0.
 | 
			
		||||
 */
 | 
			
		||||
int ldata_check(char* path) {
 | 
			
		||||
  return pack_check(path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Set the current ldata path to use.
 | 
			
		||||
 *    @param path Path to set.
 | 
			
		||||
 */
 | 
			
		||||
int ldata_setPath(char* path) {
 | 
			
		||||
  if(ldata_filename != NULL)
 | 
			
		||||
    free(ldata_filename);
 | 
			
		||||
  ldata_filename = (path == NULL) ? NULL : strdup(path);
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Open a packfile if needed.
 | 
			
		||||
 */
 | 
			
		||||
static int ldata_openPackfile(void) {
 | 
			
		||||
  int i;
 | 
			
		||||
  char** files;
 | 
			
		||||
  int nfiles;
 | 
			
		||||
  size_t len;
 | 
			
		||||
 | 
			
		||||
  if(lfile_fileExists("%s-%d.%d.%d", LDATA_FILENAME, VMAJOR, VMINOR, VREV)) {
 | 
			
		||||
    ldata_filename = malloc(PATH_MAX);
 | 
			
		||||
    snprintf(ldata_filename, PATH_MAX, "%s-%d.%d.%d", LDATA_FILENAME, VMAJOR,
 | 
			
		||||
        VMINOR, VREV);
 | 
			
		||||
  }
 | 
			
		||||
  else if(lfile_fileExists(LDATA_DEF))
 | 
			
		||||
    ldata_filename = strdup(LDATA_DEF);
 | 
			
		||||
  else {
 | 
			
		||||
    files = lfile_readDir(&nfiles, ".");
 | 
			
		||||
    len = strlen(LDATA_FILENAME);
 | 
			
		||||
    for(i = 0; i < nfiles; i++) {
 | 
			
		||||
      if(strncmp(files[i], LDATA_FILENAME, len)==0) {
 | 
			
		||||
        /* Must be packed. */
 | 
			
		||||
        if(pack_check(files[i]))
 | 
			
		||||
          continue;
 | 
			
		||||
 | 
			
		||||
        ldata_filename = strdup(files[i]);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    for(i = 0; i < nfiles; i++)
 | 
			
		||||
      free(files[i]);
 | 
			
		||||
    free(files);
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Open the ldata file.
 | 
			
		||||
 *    @return 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int ldata_open(void) {
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Close and clean up the ldata file.
 | 
			
		||||
 */
 | 
			
		||||
void ldata_close(void) {
 | 
			
		||||
  unsigned int i;
 | 
			
		||||
 | 
			
		||||
  /* Destroy the name. */
 | 
			
		||||
  if(ldata_packName != NULL) {
 | 
			
		||||
    free(ldata_packName);
 | 
			
		||||
    ldata_packName = NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Destroy the list. */
 | 
			
		||||
  if(ldata_fileList != NULL) {
 | 
			
		||||
    for(i = 0; i < ldata_fileNList; i++)
 | 
			
		||||
      free(ldata_fileList[i]);
 | 
			
		||||
 | 
			
		||||
    free(ldata_fileList);
 | 
			
		||||
    ldata_fileList = NULL;
 | 
			
		||||
    ldata_fileNList = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Close the packfile. */
 | 
			
		||||
  /*
 | 
			
		||||
  pack_close(ldata_pack);
 | 
			
		||||
  ldata_pack = NULL;
 | 
			
		||||
  */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get the ldata's name.
 | 
			
		||||
 *    @return The ldata's name.
 | 
			
		||||
 */
 | 
			
		||||
char* ldata_name(void) {
 | 
			
		||||
  char* buf;
 | 
			
		||||
  uint32_t size;
 | 
			
		||||
  xmlNodePtr node;
 | 
			
		||||
  xmlDocPtr doc;
 | 
			
		||||
 | 
			
		||||
  /* Alreay loaded. */
 | 
			
		||||
  if(ldata_packName != NULL)
 | 
			
		||||
    return ldata_packName;
 | 
			
		||||
 | 
			
		||||
  /* We'll just read it and parse it. */
 | 
			
		||||
  buf = ldata_read(START_DATA, &size);
 | 
			
		||||
  doc = xmlParseMemory(buf, size);
 | 
			
		||||
 | 
			
		||||
  /* Make sure it's what we are looking for. */
 | 
			
		||||
  node = doc->xmlChildrenNode;
 | 
			
		||||
  if(!xml_isNode(node, XML_START_ID)) {
 | 
			
		||||
    ERR("Malformed '"START_DATA"' file: missing root element '"XML_START_ID"'");
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Check if node is valid. */
 | 
			
		||||
  node = node->xmlChildrenNode; /* First system node. */
 | 
			
		||||
  if(node == NULL) {
 | 
			
		||||
    ERR("Malformed '"START_DATA"' file: does not contain elements");
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
  do {
 | 
			
		||||
    xmlr_strd(node, "name", ldata_packName);
 | 
			
		||||
  } while(xml_nextNode(node));
 | 
			
		||||
 | 
			
		||||
  xmlFreeDoc(doc);
 | 
			
		||||
  free(buf);
 | 
			
		||||
 | 
			
		||||
  /* Check if data name is found. */
 | 
			
		||||
  if(ldata_packName == NULL)
 | 
			
		||||
    WARN("No ldata packname found.");
 | 
			
		||||
  
 | 
			
		||||
  return ldata_packName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Read a file from the ldata.
 | 
			
		||||
 */
 | 
			
		||||
void* ldata_read(const char* filename, uint32_t* filesize) {
 | 
			
		||||
  if(ldata_filename == NULL)
 | 
			
		||||
    ldata_openPackfile();
 | 
			
		||||
  return pack_readfile(ldata_filename, filename, filesize);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get the list of files in the ldata.
 | 
			
		||||
 */
 | 
			
		||||
char** ldata_list(const char* path, uint32_t* nfiles) {
 | 
			
		||||
  (void)path;
 | 
			
		||||
 | 
			
		||||
  if(ldata_fileList != NULL) {
 | 
			
		||||
    *nfiles = ldata_fileNList;
 | 
			
		||||
    return ldata_fileList;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if(ldata_filename == NULL)
 | 
			
		||||
    ldata_openPackfile();
 | 
			
		||||
 | 
			
		||||
  ldata_fileList = pack_listfiles(ldata_filename, &ldata_fileNList);
 | 
			
		||||
  *nfiles = ldata_fileNList;
 | 
			
		||||
  return ldata_fileList;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								src/ldata.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/ldata.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/* ldata open/close. */
 | 
			
		||||
int ldata_open(void);
 | 
			
		||||
void ldata_close(void);
 | 
			
		||||
 | 
			
		||||
/* General. */
 | 
			
		||||
int ldata_check(char* path);
 | 
			
		||||
int ldata_setPath(char* path);
 | 
			
		||||
char* ldata_name(void);
 | 
			
		||||
 | 
			
		||||
/* Individual file functions. */
 | 
			
		||||
void* ldata_read(const char* filename, uint32_t* filesize);
 | 
			
		||||
char** ldata_list(const char* path, uint32_t* nfiles);
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,7 @@
 | 
			
		||||
#include "rng.h"
 | 
			
		||||
#include "ai.h"
 | 
			
		||||
#include "outfit.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "weapon.h"
 | 
			
		||||
#include "faction.h"
 | 
			
		||||
#include "lxml.h"
 | 
			
		||||
@ -55,9 +55,6 @@
 | 
			
		||||
#include "nebulae.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define XML_START_ID    "Start"            /**< XML document tag of module start file. */
 | 
			
		||||
#define START_DATA      "../dat/start.xml" /**< Path to module start file. */
 | 
			
		||||
 | 
			
		||||
#define CONF_FILE       "conf"             /**< Configuration file by default. */
 | 
			
		||||
#define VERSION_FILE    "VERSION"          /**< Version file by default. */
 | 
			
		||||
#define VERSION_LEN     10                 /**< Max length of the version file. */
 | 
			
		||||
@ -72,8 +69,6 @@ static char version[VERSION_LEN]; /**< Contains version. */
 | 
			
		||||
static glTexture* loading;        /**< Loading screen. */
 | 
			
		||||
 | 
			
		||||
/* Some defaults. */
 | 
			
		||||
char* data = NULL;                  /**< Path to datafile. */
 | 
			
		||||
char* dataname = NULL;              /**< Name of data file. */
 | 
			
		||||
int nosound = 0;                    /**< Disable sound when loaded. */
 | 
			
		||||
int show_fps = 1;                   /**< Shows fps - default true. */
 | 
			
		||||
int max_fps = 0;                    /**< Default FPS limit, 0 is no limit. */
 | 
			
		||||
@ -90,7 +85,6 @@ static void load_all(void);
 | 
			
		||||
static void unload_all(void);
 | 
			
		||||
static void display_fps(const double dt);
 | 
			
		||||
static void window_caption(void);
 | 
			
		||||
static void data_name(void);
 | 
			
		||||
static void debug_sigInit(void);
 | 
			
		||||
/* Update. */
 | 
			
		||||
static void fps_control(void);
 | 
			
		||||
@ -151,9 +145,12 @@ int main(int argc, char** argv) {
 | 
			
		||||
  conf_loadConfig(buf); /* Have Lua parse config. */
 | 
			
		||||
  conf_parseCLI(argc, argv); /* Parse CLI arguments. */
 | 
			
		||||
 | 
			
		||||
  /* Open the data. */
 | 
			
		||||
  if(ldata_open() != 0)
 | 
			
		||||
    ERR("Failed to open ldata.");
 | 
			
		||||
 | 
			
		||||
  /* Load the data basics. */
 | 
			
		||||
  data_name();
 | 
			
		||||
  LOG(" %s", dataname);
 | 
			
		||||
  LOG(" %s", ldata_name());
 | 
			
		||||
  DEBUG();
 | 
			
		||||
 | 
			
		||||
  /* Display the SDL Version. */
 | 
			
		||||
@ -263,6 +260,9 @@ int main(int argc, char** argv) {
 | 
			
		||||
  gl_freeFont(NULL);
 | 
			
		||||
  gl_freeFont(&gl_smallFont);
 | 
			
		||||
 | 
			
		||||
  /* Close data. */
 | 
			
		||||
  ldata_close();
 | 
			
		||||
 | 
			
		||||
  /* Exit subsystems. */
 | 
			
		||||
  toolkit_exit();   /* Kill the toolkit. */
 | 
			
		||||
  ai_exit();        /* Stop the Lua AI magicness. */
 | 
			
		||||
@ -292,7 +292,7 @@ void loadscreen_load(void) {
 | 
			
		||||
  int nload;
 | 
			
		||||
 | 
			
		||||
  /* Count the loading screens. */
 | 
			
		||||
  files = pack_listfiles(data, &nfiles);
 | 
			
		||||
  files = ldata_list("../gfx/loading/", &nfiles);
 | 
			
		||||
  len = strlen("../gfx/loading/");
 | 
			
		||||
  nload = 0;
 | 
			
		||||
  loadscreens = malloc(sizeof(char*) * nfiles);
 | 
			
		||||
@ -300,8 +300,7 @@ void loadscreen_load(void) {
 | 
			
		||||
    if(strncmp(files[i], "../gfx/loading/", len)==0) {
 | 
			
		||||
      loadscreens[nload] = files[i];
 | 
			
		||||
      nload++;
 | 
			
		||||
    } else
 | 
			
		||||
      free(files[i]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Must have loading screens. */
 | 
			
		||||
@ -315,8 +314,6 @@ void loadscreen_load(void) {
 | 
			
		||||
  loading = gl_newImage(file_path);
 | 
			
		||||
 | 
			
		||||
  /* Clean up. */
 | 
			
		||||
  for(i = 0; i < nload; i++)
 | 
			
		||||
    free(loadscreens[i]);
 | 
			
		||||
  free(loadscreens);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -595,73 +592,16 @@ static void display_fps(const double dt) {
 | 
			
		||||
    gl_print(NULL, x, y, NULL, "%3.1fx", dt_mod);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @fn static void data_name(void)
 | 
			
		||||
 *
 | 
			
		||||
 * @brief Set the data module's name.
 | 
			
		||||
 */
 | 
			
		||||
static void data_name(void) {
 | 
			
		||||
  uint32_t bufsize;
 | 
			
		||||
  char* buf;
 | 
			
		||||
 | 
			
		||||
  /* Check if data file is valid. */
 | 
			
		||||
  if((DATA == NULL) || (pack_check(DATA))) {
 | 
			
		||||
    WARN("Data file '%s' not found", DATA);
 | 
			
		||||
    WARN("You should specify which data file to use with '-d'");
 | 
			
		||||
    WARN("See -h or --help for more information");
 | 
			
		||||
    SDL_Quit();
 | 
			
		||||
    exit(EXIT_FAILURE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Check the version. */
 | 
			
		||||
  buf = pack_readfile(DATA, VERSION_FILE, &bufsize);
 | 
			
		||||
 | 
			
		||||
  if(strncmp(buf, version, bufsize) != 0) {
 | 
			
		||||
    WARN("Lephisto version and data module version differ!");
 | 
			
		||||
    WARN("Lephisto is v%s, data is for v%s", version, buf);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  free(buf);
 | 
			
		||||
 | 
			
		||||
  /* Load the datafiles name. */
 | 
			
		||||
  buf = pack_readfile(DATA, START_DATA, &bufsize);
 | 
			
		||||
 | 
			
		||||
  xmlNodePtr node;
 | 
			
		||||
  xmlDocPtr doc = xmlParseMemory(buf, bufsize);
 | 
			
		||||
 | 
			
		||||
  node = doc->xmlChildrenNode;
 | 
			
		||||
  if(!xml_isNode(node, XML_START_ID)) {
 | 
			
		||||
    ERR("Maformed '"START_DATA"' file: missing root element '"XML_START_ID"'");
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  node = node->xmlChildrenNode; /* First node. */
 | 
			
		||||
  if(node == NULL) {
 | 
			
		||||
    ERR("Malformed '"START_DATA"' file: does not contain elements");
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  do {
 | 
			
		||||
    xmlr_strd(node, "name", dataname);
 | 
			
		||||
  } while(xml_nextNode(node));
 | 
			
		||||
 | 
			
		||||
  xmlFreeDoc(doc);
 | 
			
		||||
  free(buf);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @fn static void window_caption(void)
 | 
			
		||||
 *
 | 
			
		||||
 * @brief Set the window caption.
 | 
			
		||||
 */
 | 
			
		||||
static void window_caption(void) {
 | 
			
		||||
  size_t len;
 | 
			
		||||
  char* tmp;
 | 
			
		||||
  char buf[PATH_MAX];
 | 
			
		||||
 | 
			
		||||
  len = strlen(dataname) + strlen(APPNAME);
 | 
			
		||||
  tmp = malloc(sizeof(char)*len);
 | 
			
		||||
  snprintf(tmp, len, APPNAME" - %s", dataname);
 | 
			
		||||
  SDL_WM_SetCaption(tmp, NULL);
 | 
			
		||||
  free(tmp);
 | 
			
		||||
  snprintf(buf, PATH_MAX, APPNAME" - %s", ldata_name());
 | 
			
		||||
  SDL_WM_SetCaption(buf, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static char human_version[50];  /**< Stores human readable version string. */
 | 
			
		||||
@ -675,7 +615,7 @@ static char human_version[50];  /**< Stores human readable version string. */
 | 
			
		||||
 */
 | 
			
		||||
char* lephisto_version(void) {
 | 
			
		||||
  if(human_version[0] == '\0')
 | 
			
		||||
    snprintf(human_version, 50, " "APPNAME" v%s - %s", version, dataname);
 | 
			
		||||
    snprintf(human_version, 50, " "APPNAME" v%s - %s", version, ldata_name());
 | 
			
		||||
 | 
			
		||||
  return human_version;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -19,15 +19,6 @@
 | 
			
		||||
 | 
			
		||||
#define pow2(x)   ((x)*(x))             /**< ^2 */
 | 
			
		||||
 | 
			
		||||
#define DATA_NAME "ldata"               /**< Default data name. */
 | 
			
		||||
 | 
			
		||||
#ifndef DATA_DEF
 | 
			
		||||
#define DATA_DEF   DATA_NAME            /**< Default data packfile. */
 | 
			
		||||
#endif
 | 
			
		||||
extern char* data;                      /**< Modifiable datafile. */
 | 
			
		||||
#define DATA        data                /**< Standard data file to use. */
 | 
			
		||||
extern char *dataname;                  /**< Datafile name. */
 | 
			
		||||
 | 
			
		||||
/* Max filename path. */
 | 
			
		||||
#ifndef PATH_MAX
 | 
			
		||||
#  define PATH_MAX 256                  /**< If not already defined. */
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@
 | 
			
		||||
#include "space.h"
 | 
			
		||||
#include "land.h"
 | 
			
		||||
#include "map.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "lluadef.h"
 | 
			
		||||
#include "llua.h"
 | 
			
		||||
 | 
			
		||||
@ -142,9 +142,9 @@ static int llua_packfileLoader(lua_State* L) {
 | 
			
		||||
  filename = (char*) lua_tostring(L, 1);
 | 
			
		||||
 | 
			
		||||
  /* Try to locate the data. */
 | 
			
		||||
  buf = pack_readfile(DATA, filename, &bufsize);
 | 
			
		||||
  buf = ldata_read(filename, &bufsize);
 | 
			
		||||
  if(buf == NULL) {
 | 
			
		||||
    lua_pushfstring(L, "%s not found in packfile %s", filename, DATA);
 | 
			
		||||
    lua_pushfstring(L, "%s not found in ldata.", filename);
 | 
			
		||||
    return 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "hook.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "lxml.h"
 | 
			
		||||
#include "faction.h"
 | 
			
		||||
#include "player.h"
 | 
			
		||||
@ -117,7 +117,7 @@ static int mission_init(Mission* mission, MissionData* misn, int load) {
 | 
			
		||||
  misn_loadLibs(mission->L);             /* Load our custom libraries. */
 | 
			
		||||
 | 
			
		||||
  /* Load the file. */
 | 
			
		||||
  buf = pack_readfile(DATA, misn->lua, &bufsize);
 | 
			
		||||
  buf = ldata_read(misn->lua, &bufsize);
 | 
			
		||||
  if(luaL_dobuffer(mission->L, buf, bufsize, misn->lua) != 0) {
 | 
			
		||||
    ERR("Error loading mission file: %s\n"
 | 
			
		||||
        "%s\n"
 | 
			
		||||
@ -551,7 +551,7 @@ static MissionData* mission_parse(const xmlNodePtr parent) {
 | 
			
		||||
/* Load/Free. */
 | 
			
		||||
int missions_load(void) {
 | 
			
		||||
  uint32_t bufsize;
 | 
			
		||||
  char* buf = pack_readfile(DATA, MISSION_DATA, &bufsize);
 | 
			
		||||
  char* buf = ldata_read(MISSION_DATA, &bufsize);
 | 
			
		||||
 | 
			
		||||
  MissionData* tmp;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								src/music.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								src/music.c
									
									
									
									
									
								
							@ -13,7 +13,7 @@
 | 
			
		||||
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "music.h"
 | 
			
		||||
 | 
			
		||||
#define MUSIC_PREFIX    "../snd/music/" /**< Prefix of where to find music. */
 | 
			
		||||
@ -173,7 +173,7 @@ static int music_find(void) {
 | 
			
		||||
  if(music_disabled) return 0;
 | 
			
		||||
 | 
			
		||||
  /* Get the file list. */
 | 
			
		||||
  files = pack_listfiles(data, &nfiles);
 | 
			
		||||
  files = ldata_list(MUSIC_PREFIX, &nfiles);
 | 
			
		||||
 | 
			
		||||
  /* Load the profiles. */
 | 
			
		||||
  mem = 0;
 | 
			
		||||
@ -199,11 +199,6 @@ static int music_find(void) {
 | 
			
		||||
  }
 | 
			
		||||
  music_selection = realloc(music_selection, sizeof(char*)*nmusic_selection);
 | 
			
		||||
 | 
			
		||||
  /* Free the char* allocated by pack. */
 | 
			
		||||
  for(i = 0; i < nfiles; i++)
 | 
			
		||||
    free(files[i]);
 | 
			
		||||
  free(files);
 | 
			
		||||
 | 
			
		||||
  DEBUG("Loaded %d song%c", nmusic_selection, (nmusic_selection==1)?' ':'s');
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
@ -238,7 +233,7 @@ void music_load(const char* name) {
 | 
			
		||||
 | 
			
		||||
  /* Load the data. */
 | 
			
		||||
  snprintf(filename, PATH_MAX, MUSIC_PREFIX"%s"MUSIC_SUFFIX, name);
 | 
			
		||||
  music_data = pack_readfile(DATA, filename, &size);
 | 
			
		||||
  music_data = ldata_read(filename, &size);
 | 
			
		||||
  music_rw = SDL_RWFromMem(music_data, size);
 | 
			
		||||
  music_music = Mix_LoadMUS_RW(music_rw);
 | 
			
		||||
  if(music_music == NULL)
 | 
			
		||||
@ -336,7 +331,7 @@ static int music_luaInit(void) {
 | 
			
		||||
  lua_loadMusic(music_lua, 0);  /* Write it. */
 | 
			
		||||
 | 
			
		||||
  /* Load the actual lua music code. */
 | 
			
		||||
  buf = pack_readfile(DATA, MUSIC_LUA_PATH, &bufsize);
 | 
			
		||||
  buf = ldata_read(MUSIC_LUA_PATH, &bufsize);
 | 
			
		||||
  if(luaL_dobuffer(music_lua, buf, bufsize, MUSIC_LUA_PATH) != 0) {
 | 
			
		||||
    ERR("Error loading music file: %s\n"
 | 
			
		||||
        "%s\n"
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@
 | 
			
		||||
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "opengl.h"
 | 
			
		||||
 | 
			
		||||
/* Requirements. */
 | 
			
		||||
@ -394,9 +394,9 @@ static glTexture* gl_loadNewImage(const char* path) {
 | 
			
		||||
  char* buf;
 | 
			
		||||
 | 
			
		||||
  /* Load from packfile. */
 | 
			
		||||
  buf = pack_readfile(DATA, (char*)path, &filesize);
 | 
			
		||||
  buf = ldata_read(path, &filesize);
 | 
			
		||||
  if(buf == NULL) {
 | 
			
		||||
    ERR("Loading surface from packfile.");
 | 
			
		||||
    ERR("Loading surface from ldata.");
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
  SDL_RWops* rw = SDL_RWFromMem(buf, filesize);
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@
 | 
			
		||||
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "lxml.h"
 | 
			
		||||
#include "spfx.h"
 | 
			
		||||
#include "outfit.h"
 | 
			
		||||
@ -1038,7 +1038,7 @@ static int outfit_parse(Outfit* tmp, const xmlNodePtr parent) {
 | 
			
		||||
int outfit_load(void) {
 | 
			
		||||
  int i, mem;
 | 
			
		||||
  uint32_t bufsize;
 | 
			
		||||
  char* buf = pack_readfile(DATA, OUTFIT_DATA, &bufsize);
 | 
			
		||||
  char* buf = ldata_read(OUTFIT_DATA, &bufsize);
 | 
			
		||||
 | 
			
		||||
  xmlNodePtr node;
 | 
			
		||||
  xmlDocPtr doc = xmlParseMemory(buf, bufsize);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										92
									
								
								src/pack.c
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								src/pack.c
									
									
									
									
									
								
							@ -32,13 +32,31 @@
 | 
			
		||||
 * -- Pack the files.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @struct Packfile
 | 
			
		||||
 *
 | 
			
		||||
 * @brief Abstracts around packfiles.
 | 
			
		||||
 */
 | 
			
		||||
struct Packfile_s {
 | 
			
		||||
#ifdef _POSIX_SOURCE
 | 
			
		||||
  int fd; /**< File descriptor. */
 | 
			
		||||
#else
 | 
			
		||||
  FILE* fp; /**< For non-posix. */
 | 
			
		||||
#endif
 | 
			
		||||
  uint32_t pos;   /**< Cursor position. */
 | 
			
		||||
  uint32_t start; /**< File start. */
 | 
			
		||||
  uint32_t end;   /**< File end. */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#undef DEBUG /* This will be spammy. */
 | 
			
		||||
#define DEBUG(str, args...) do{;} while(0)
 | 
			
		||||
 | 
			
		||||
#define BLOCKSIZE 128*1024 /**< The read/write block size */
 | 
			
		||||
 | 
			
		||||
/* Max filename length. */
 | 
			
		||||
#define MAX_FILENAME 100 /**< Maximum file name length. */
 | 
			
		||||
#ifndef PATH_MAX
 | 
			
		||||
#define PATH_MAX  256
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define PERMS S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH /**< Default permissions. */
 | 
			
		||||
 | 
			
		||||
@ -165,9 +183,9 @@ int pack_files(const char* outfile, const char** infiles, const uint32_t nfiles)
 | 
			
		||||
      ERR("File %s does not exist", infiles[i]);
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
    if(strlen(infiles[i]) > MAX_FILENAME) {
 | 
			
		||||
    if(strlen(infiles[i]) > PATH_MAX) {
 | 
			
		||||
      ERR("filename '%s' is too long, should be only %d characters", infiles[i],
 | 
			
		||||
          MAX_FILENAME);
 | 
			
		||||
          PATH_MAX);
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
    namesize += strlen(infiles[i]);
 | 
			
		||||
@ -251,30 +269,32 @@ int pack_files(const char* outfile, const char** infiles, const uint32_t nfiles)
 | 
			
		||||
}
 | 
			
		||||
#undef WRITE
 | 
			
		||||
 | 
			
		||||
#ifdef _POSIX_SOURCE
 | 
			
		||||
#define READ(b,n) if(read(file->fd, (b), (n))!=(n)) { \
 | 
			
		||||
  ERR("Fewer bytes read than expected."); \
 | 
			
		||||
  free(buf); return NULL; }
 | 
			
		||||
#else
 | 
			
		||||
#define READ(b,n) if(fread((b), 1, (n), file->fp)!=(n)) { \
 | 
			
		||||
  ERR("Fewer bytes read then expected"); \
 | 
			
		||||
  free(buf); return NULL; }
 | 
			
		||||
#endif
 | 
			
		||||
/**
 | 
			
		||||
 * @fn int pack_open(Packfile* file, const char* packfile, const char* filename)
 | 
			
		||||
 *
 | 
			
		||||
 * @brief Open a file in the packfile for reading.
 | 
			
		||||
 *    @param file Packfile to store data into.
 | 
			
		||||
 *    @param packfile Path to real packfile.
 | 
			
		||||
 *    @param filename Name of the file within th. packfile.
 | 
			
		||||
 *    @return 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef _POSIX_SOURCE
 | 
			
		||||
#define READ(b,n) if(read(file->fd, (b), (n))!=(n)) { \
 | 
			
		||||
  ERR("Too few bytes read. Expected more."); \
 | 
			
		||||
  free(buf); return -1; }
 | 
			
		||||
#else
 | 
			
		||||
#define READ(b,n) if(fread((b), 1, (n), file->fp)!=(n)) { \
 | 
			
		||||
  ERR("Fewer bytes read then expected"); \
 | 
			
		||||
  free(buf); return -1; }
 | 
			
		||||
#endif
 | 
			
		||||
int pack_open(Packfile* file, const char* packfile, const char* filename) {
 | 
			
		||||
Packfile_t* pack_open(const char* packfile, const char* filename) {
 | 
			
		||||
  int j;
 | 
			
		||||
  uint32_t nfiles, i;
 | 
			
		||||
  char* buf = malloc(MAX_FILENAME);
 | 
			
		||||
  char* buf = malloc(PATH_MAX);
 | 
			
		||||
  Packfile_t* file;
 | 
			
		||||
 | 
			
		||||
  file->start = file->end = 0;
 | 
			
		||||
  /* Allocate memory. */
 | 
			
		||||
  file = malloc(sizeof(Packfile_t));
 | 
			
		||||
  memset(file, 0, sizeof(Packfile_t));
 | 
			
		||||
  buf = malloc(PATH_MAX);
 | 
			
		||||
 | 
			
		||||
#ifdef _POSIX_SOURCE
 | 
			
		||||
  file->fd = open(packfile, O_RDONLY);
 | 
			
		||||
@ -284,13 +304,13 @@ int pack_open(Packfile* file, const char* packfile, const char* filename) {
 | 
			
		||||
  if(file->fp == NULL) {
 | 
			
		||||
#endif
 | 
			
		||||
    ERR("Error opening %s: %s", filename, strerror(errno));
 | 
			
		||||
    return -1;
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  READ(buf, sizeof(magic)); /* Make sure it's a packfile. */
 | 
			
		||||
  if(memcmp(buf, &magic, sizeof(magic))) {
 | 
			
		||||
    ERR("File %s is not a valid packfile", filename);
 | 
			
		||||
    return -1;
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  READ(&nfiles, 4);
 | 
			
		||||
@ -324,7 +344,7 @@ int pack_open(Packfile* file, const char* packfile, const char* filename) {
 | 
			
		||||
    if(errno) {
 | 
			
		||||
#endif
 | 
			
		||||
      ERR("Failure to seek to file start: %s", strerror(errno));
 | 
			
		||||
      return -1;
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    READ(&file->end, 4);
 | 
			
		||||
    DEBUG("\t%d bytes", file->end);
 | 
			
		||||
@ -332,15 +352,13 @@ int pack_open(Packfile* file, const char* packfile, const char* filename) {
 | 
			
		||||
    file->end += file->start;
 | 
			
		||||
  } else {
 | 
			
		||||
    ERR("File '%s' not found in packfile '%s'", filename, packfile);
 | 
			
		||||
    return -1;
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
  return file;
 | 
			
		||||
}
 | 
			
		||||
#undef READ
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @fn ssize_t pack_read(Packfile* file, void* buf, size_t count)
 | 
			
		||||
 *
 | 
			
		||||
 * @brief Reads data from a packfile.
 | 
			
		||||
 *
 | 
			
		||||
 * Behaves like POSIX read.
 | 
			
		||||
@ -349,7 +367,7 @@ int pack_open(Packfile* file, const char* packfile, const char* filename) {
 | 
			
		||||
 *    @param count Bytes to read.
 | 
			
		||||
 *    @return Bytes to read or -1 on error.
 | 
			
		||||
 */
 | 
			
		||||
ssize_t pack_read(Packfile* file, void* buf, size_t count) {
 | 
			
		||||
ssize_t pack_read(Packfile_t* file, void* buf, size_t count) {
 | 
			
		||||
  if(file->pos + count > file->end)
 | 
			
		||||
    count = file->end - file->pos; /* Can't go past the end! */
 | 
			
		||||
  if(count == 0) return 0;
 | 
			
		||||
@ -370,8 +388,6 @@ ssize_t pack_read(Packfile* file, void* buf, size_t count) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @fn off_t pack_seek(Packfile* file, off_t offset, int whence)
 | 
			
		||||
 *
 | 
			
		||||
 * @brief Seeks within a file inside a packfile.
 | 
			
		||||
 *
 | 
			
		||||
 * Behaves like lseek/fseek.
 | 
			
		||||
@ -382,7 +398,7 @@ ssize_t pack_read(Packfile* file, void* buf, size_t count) {
 | 
			
		||||
 *    @param whence Either SEEK_SET, SEEK_CUR or SEEK_END.
 | 
			
		||||
 *    @return The position moved to.
 | 
			
		||||
 */
 | 
			
		||||
off_t pack_seek(Packfile* file, off_t offset, int whence) {
 | 
			
		||||
off_t pack_seek(Packfile_t* file, off_t offset, int whence) {
 | 
			
		||||
  DEBUG("Attempting to seek offset: %d, whence: %d", offset, whence);
 | 
			
		||||
  off_t ret;
 | 
			
		||||
  switch(whence) {
 | 
			
		||||
@ -427,13 +443,11 @@ off_t pack_seek(Packfile* file, off_t offset, int whence) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @fn long pack_tell(Packfile* file)
 | 
			
		||||
 *
 | 
			
		||||
 * @brief Get the current position in the file.
 | 
			
		||||
 *    @param file Packfile to get the position from.
 | 
			
		||||
 *    @return The current position in the file.
 | 
			
		||||
 */
 | 
			
		||||
long pack_tell(Packfile* file) {
 | 
			
		||||
long pack_tell(Packfile_t* file) {
 | 
			
		||||
  return file->pos - file->start;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -447,16 +461,19 @@ long pack_tell(Packfile* file) {
 | 
			
		||||
 *    @return A pointer to the sata in the file or NULL if an error accured.
 | 
			
		||||
 */
 | 
			
		||||
void* pack_readfile(const char* packfile, const char* filename, uint32_t* filesize) {
 | 
			
		||||
  Packfile* file = (Packfile*)malloc(sizeof(Packfile));
 | 
			
		||||
  Packfile_t* file;
 | 
			
		||||
  void* buf;
 | 
			
		||||
  char* str;
 | 
			
		||||
  int size, bytes;
 | 
			
		||||
 | 
			
		||||
  /* Initialize size to 0. */
 | 
			
		||||
  if(filesize)
 | 
			
		||||
    *filesize = 0;
 | 
			
		||||
 | 
			
		||||
  if(pack_open(file, packfile, filename)) {
 | 
			
		||||
    ERR("Opening packfile");
 | 
			
		||||
  /* Open the packfile. */
 | 
			
		||||
  file = pack_open(packfile, filename);
 | 
			
		||||
  if(file == NULL) {
 | 
			
		||||
    ERR("Opening packfile '%s'.", packfile);
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
  DEBUG("Opened file '%s' from '%s'", filename, packfile);
 | 
			
		||||
@ -505,7 +522,6 @@ void* pack_readfile(const char* packfile, const char* filename, uint32_t* filesi
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
  DEBUG("Closed '%s' in '%s'", filename, packfile);
 | 
			
		||||
  free(file);
 | 
			
		||||
 | 
			
		||||
  if(filesize)
 | 
			
		||||
    *filesize = size;
 | 
			
		||||
@ -565,7 +581,7 @@ char** pack_listfiles(const char* packfile, uint32_t* nfiles) {
 | 
			
		||||
  for(i = 0; i < *nfiles; i++) {
 | 
			
		||||
    /* Start searching files. */
 | 
			
		||||
    j = 0;
 | 
			
		||||
    filenames[i] = malloc(MAX_FILENAME * sizeof(char));
 | 
			
		||||
    filenames[i] = malloc(PATH_MAX * sizeof(char));
 | 
			
		||||
    READ(&filenames[i][j], 1); /* Get the name. */
 | 
			
		||||
    while(filenames[i][j++] != '\0')
 | 
			
		||||
      READ(&filenames[i][j], 1);
 | 
			
		||||
@ -584,13 +600,11 @@ char** pack_listfiles(const char* packfile, uint32_t* nfiles) {
 | 
			
		||||
#undef READ
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @fn int pack_close(Packfile* file)
 | 
			
		||||
 *
 | 
			
		||||
 * @brief Closes a packfile.
 | 
			
		||||
 *    @param file Packfile to close.
 | 
			
		||||
 *    @return 0 on success.
 | 
			
		||||
 */
 | 
			
		||||
int pack_close(Packfile* file) {
 | 
			
		||||
int pack_close(Packfile_t* file) {
 | 
			
		||||
  int i;
 | 
			
		||||
#ifdef _POSIX_SOURCE
 | 
			
		||||
  i = close(file->fd);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										28
									
								
								src/pack.h
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								src/pack.h
									
									
									
									
									
								
							@ -6,33 +6,19 @@
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @struct Packfile
 | 
			
		||||
 *
 | 
			
		||||
 * @brief Abstracts around packfile
 | 
			
		||||
 */
 | 
			
		||||
typedef struct Packfile_ {
 | 
			
		||||
#ifdef _POSIX_SOURCE
 | 
			
		||||
  int fd;               /**< File descriptor. */
 | 
			
		||||
#else
 | 
			
		||||
  FILE* fp;             /**< For non-posix. */
 | 
			
		||||
#endif
 | 
			
		||||
  uint32_t pos;         /**< position. */
 | 
			
		||||
  uint32_t start;       /**< File start */
 | 
			
		||||
  uint32_t end;         /**< File end. */
 | 
			
		||||
} Packfile;
 | 
			
		||||
struct Packfile_s;
 | 
			
		||||
typedef struct Packfile_s Packfile_t;
 | 
			
		||||
 | 
			
		||||
/* Packfile manipulation. Automatically allocated and freed (with open and close). */
 | 
			
		||||
 | 
			
		||||
/* Basic. */
 | 
			
		||||
int pack_check(const char* filename);
 | 
			
		||||
int pack_files(const char* outfile, const char** infiles, const uint32_t nfiles);
 | 
			
		||||
int pack_open(Packfile* file, const char* packfile, const char* filename);
 | 
			
		||||
ssize_t pack_read(Packfile* file, void* buf, const size_t count);
 | 
			
		||||
off_t pack_seek(Packfile* file, off_t offset, int whence);
 | 
			
		||||
long pack_tell(Packfile* file);
 | 
			
		||||
int pack_close(Packfile* file);
 | 
			
		||||
Packfile_t* pack_open(const char* packfile, const char* filename);
 | 
			
		||||
ssize_t pack_read(Packfile_t* file, void* buf, const size_t count);
 | 
			
		||||
off_t pack_seek(Packfile_t* file, off_t offset, int whence);
 | 
			
		||||
long pack_tell(Packfile_t* file);
 | 
			
		||||
int pack_close(Packfile_t* file);
 | 
			
		||||
 | 
			
		||||
/* Fancy stuff. */
 | 
			
		||||
void* pack_readfile(const char* packfile, const char* filename, uint32_t* filesize);
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "weapon.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "lxml.h"
 | 
			
		||||
#include "spfx.h"
 | 
			
		||||
#include "rng.h"
 | 
			
		||||
@ -1785,7 +1785,7 @@ static int fleet_parse(Fleet* tmp, const xmlNodePtr parent) {
 | 
			
		||||
int fleet_load(void) {
 | 
			
		||||
  int mem;
 | 
			
		||||
  uint32_t bufsize;
 | 
			
		||||
  char* buf = pack_readfile(DATA, FLEET_DATA, &bufsize);
 | 
			
		||||
  char* buf = ldata_read(FLEET_DATA, &bufsize);
 | 
			
		||||
 | 
			
		||||
  xmlNodePtr node;
 | 
			
		||||
  xmlDocPtr doc = xmlParseMemory(buf, bufsize);
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "opengl.h"
 | 
			
		||||
#include "font.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "lxml.h"
 | 
			
		||||
#include "space.h"
 | 
			
		||||
#include "rng.h"
 | 
			
		||||
@ -337,7 +337,7 @@ static int player_newMake(void) {
 | 
			
		||||
  sysname = NULL;
 | 
			
		||||
  player_mission = NULL;
 | 
			
		||||
 | 
			
		||||
  buf = pack_readfile(DATA, START_DATA, &bufsize);
 | 
			
		||||
  buf = ldata_read(START_DATA, &bufsize);
 | 
			
		||||
 | 
			
		||||
  xmlNodePtr node, cur, tmp;
 | 
			
		||||
  xmlDocPtr doc = xmlParseMemory(buf, bufsize);
 | 
			
		||||
@ -1393,7 +1393,7 @@ int gui_init(void) {
 | 
			
		||||
 */
 | 
			
		||||
int gui_load(const char* name) {
 | 
			
		||||
  uint32_t bufsize;
 | 
			
		||||
  char* buf = pack_readfile(DATA, GUI_DATA, &bufsize);
 | 
			
		||||
  char* buf = ldata_read(GUI_DATA, &bufsize);
 | 
			
		||||
  char* tmp;
 | 
			
		||||
  int found = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -8,6 +8,7 @@
 | 
			
		||||
#include "menu.h"
 | 
			
		||||
#include "lfile.h"
 | 
			
		||||
#include "hook.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "save.h"
 | 
			
		||||
 | 
			
		||||
#define LOAD_WIDTH    400
 | 
			
		||||
@ -70,7 +71,7 @@ int save_all(void) {
 | 
			
		||||
  /* Save the version or something.. */
 | 
			
		||||
  xmlw_startElem(writer, "version");
 | 
			
		||||
  xmlw_elem(writer, "lephisto", "%d.%d.%d", VMAJOR, VMINOR, VREV);
 | 
			
		||||
  xmlw_elem(writer, "data", dataname);
 | 
			
		||||
  xmlw_elem(writer, "data", ldata_name);
 | 
			
		||||
  xmlw_endElem(writer); /* Version. */
 | 
			
		||||
 | 
			
		||||
  if(save_data(writer) < 0) {
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "lxml.h"
 | 
			
		||||
#include "toolkit.h"
 | 
			
		||||
#include "ship.h"
 | 
			
		||||
@ -372,7 +372,7 @@ static int ship_parse(Ship* tmp, xmlNodePtr parent) {
 | 
			
		||||
int ships_load(void) {
 | 
			
		||||
  int mem;
 | 
			
		||||
  uint32_t bufsize;
 | 
			
		||||
  char* buf = pack_readfile(DATA, SHIP_DATA, &bufsize);
 | 
			
		||||
  char* buf = ldata_read(SHIP_DATA, &bufsize);
 | 
			
		||||
 | 
			
		||||
  xmlNodePtr node;
 | 
			
		||||
  xmlDocPtr doc = xmlParseMemory(buf, bufsize);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								src/sound.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/sound.c
									
									
									
									
									
								
							@ -12,7 +12,7 @@
 | 
			
		||||
 | 
			
		||||
#include "lephisto.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "music.h"
 | 
			
		||||
#include "physics.h"
 | 
			
		||||
#include "sound.h"
 | 
			
		||||
@ -434,7 +434,7 @@ static int sound_makeList(void) {
 | 
			
		||||
  if(sound_disabled) return 0;
 | 
			
		||||
 | 
			
		||||
  /* Get the file list. */
 | 
			
		||||
  files = pack_listfiles(data, &nfiles);
 | 
			
		||||
  files = ldata_list(SOUND_PREFIX, &nfiles);
 | 
			
		||||
 | 
			
		||||
  /* Load the profiles. */
 | 
			
		||||
  mem = 0;
 | 
			
		||||
@ -463,11 +463,6 @@ static int sound_makeList(void) {
 | 
			
		||||
  /* Shrink to minimum ram usage. */
 | 
			
		||||
  sound_list = realloc(sound_list, sound_nlist*sizeof(alSound));
 | 
			
		||||
 | 
			
		||||
  /* Free the char* allocated by pack. */
 | 
			
		||||
  for(i = 0; i < nfiles; i++)
 | 
			
		||||
    free(files[i]);
 | 
			
		||||
  free(files);
 | 
			
		||||
 | 
			
		||||
  DEBUG("Loaded %d sound%s", sound_nlist, (sound_nlist==1)?"":"s");
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
@ -503,7 +498,7 @@ static Mix_Chunk* sound_load(char* filename) {
 | 
			
		||||
  if(sound_disabled) return NULL;
 | 
			
		||||
 | 
			
		||||
  /* Get the file data buffer from the packfile. */
 | 
			
		||||
  wavdata = pack_readfile(DATA, filename, &size);
 | 
			
		||||
  wavdata = ldata_read(filename, &size);
 | 
			
		||||
  rw = SDL_RWFromMem(wavdata, size);
 | 
			
		||||
 | 
			
		||||
  /* Bind to OpenAL buffer. */
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "physics.h"
 | 
			
		||||
#include "rng.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "player.h"
 | 
			
		||||
#include "pause.h"
 | 
			
		||||
#include "weapon.h"
 | 
			
		||||
@ -616,7 +616,7 @@ static int planets_load(void) {
 | 
			
		||||
  xmlNodePtr node;
 | 
			
		||||
  xmlDocPtr doc;
 | 
			
		||||
 | 
			
		||||
  buf = pack_readfile(DATA, PLANET_DATA, &bufsize);
 | 
			
		||||
  buf = ldata_read(PLANET_DATA, &bufsize);
 | 
			
		||||
  doc = xmlParseMemory(buf, bufsize);
 | 
			
		||||
 | 
			
		||||
  node = doc->xmlChildrenNode;
 | 
			
		||||
@ -1135,7 +1135,7 @@ int space_load(void) {
 | 
			
		||||
 */
 | 
			
		||||
static int systems_load(void) {
 | 
			
		||||
  uint32_t bufsize;
 | 
			
		||||
  char* buf = pack_readfile(DATA, SYSTEM_DATA, &bufsize);
 | 
			
		||||
  char* buf = ldata_read(SYSTEM_DATA, &bufsize);
 | 
			
		||||
 | 
			
		||||
  xmlNodePtr node;
 | 
			
		||||
  xmlDocPtr doc = xmlParseMemory(buf, bufsize);
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "lxml.h"
 | 
			
		||||
#include "space.h"
 | 
			
		||||
#include "pack.h"
 | 
			
		||||
#include "ldata.h"
 | 
			
		||||
#include "unidiff.h"
 | 
			
		||||
 | 
			
		||||
#define CHUNK_SIZE    32                    /**< Size of chunk to allocate. */
 | 
			
		||||
@ -153,7 +153,7 @@ int diff_apply(char* name) {
 | 
			
		||||
  if(diff_isApplied(name))
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
  buf = pack_readfile(DATA, DIFF_DATA, &bufsize);
 | 
			
		||||
  buf = ldata_read(DIFF_DATA, &bufsize);
 | 
			
		||||
  doc = xmlParseMemory(buf, bufsize);
 | 
			
		||||
 | 
			
		||||
  node = doc->xmlChildrenNode;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user