Added the linked list struct, LList, along with two functions for initializing and freeing a single LList. Also added the fio.c/.h files that will contain all functions pertaining to more complicated file or directory access. At the moment it provides two functions: dirToLList, which populates a linked list with the contents of the directory (as explained in the source), and fileExists, a simple function that checks if the file exists.

master
kts 2014-03-03 22:48:00 -08:00
parent 1ebb045fef
commit f9f65cd376
8 changed files with 131 additions and 1 deletions

View File

@ -1,7 +1,7 @@
CC = gcc
PREFIX = ./
BINARY=timesynk
OBJS = main.o c_extra.o state_menu.o ui/elements.o sdl/timer.o sdl/r_soft.o sdl/r_gl.o sdl/interface.o sdl/sdl_extra.o sdl/spritesheets.o sdl/font.o resources/badfont_large_png.o resources/badfont_medium_png.o resources/ui_png.o resources/menu_bg_png.o data.o
OBJS = main.o c_extra.o state_menu.o ui/elements.o sdl/timer.o sdl/r_soft.o sdl/r_gl.o sdl/interface.o sdl/sdl_extra.o sdl/spritesheets.o sdl/font.o resources/badfont_large_png.o resources/badfont_medium_png.o resources/ui_png.o resources/menu_bg_png.o data.o llist.o fio.o
DEBUG = -g
CFLAGS = -Wall -c $(DEBUG)
SDL_LFLAGS = -lGL -lSDL -lSDL_image

71
engine/fio.c 100644
View File

@ -0,0 +1,71 @@
#include "fio.h"
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
/*
================================
struct LList *dirToLList(const char *dir_name, int opts)
This function takes a given directory path and attempts to populate a linked list(LList) with the contents of the directory (excluding ".." and "."). The opts argument must be provided with F_DIRS, F_FILES, or both F_DIRS|F_FILES. This limits the items added to the linked list to only directories, only files, or both.
================================
*/
struct LList *dirToLList(const char *dir_name, int opts) {
struct dirent *entry;
DIR *dir = opendir(dir_name);
if (dir == NULL)
return NULL;
struct LList *start = NULL;
struct LList *llist = NULL;
struct LList *llist_last = NULL;
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
int entry_size = strlen(entry->d_name)+1;
// ugly
char file_path[strlen(dir_name)+entry_size];
strcpy(file_path, dir_name);
file_path[strlen(dir_name)] = '/';
memcpy(file_path+strlen(dir_name)+1, entry->d_name, entry_size);
// ok, let's get file properties and see if we want it
struct stat file_stat;
stat(file_path, &file_stat);
switch(file_stat.st_mode & S_IFMT) {
case S_IFDIR:
if (~opts & F_DIRS)
continue;
break;
case S_IFREG:
if (~opts & F_FILES)
continue;
break;
}
// if we got here, then the entry is valid
llist = newLList();
llist->data = malloc(entry_size);
llist->size = entry_size;
memcpy(llist->data, entry->d_name, entry_size);
if (start == NULL)
start = llist;
if (llist_last != NULL)
llist_last->next = llist;
llist_last = llist;
}
closedir(dir);
return start;
}
/*
================================
int fileExists(const char *filename)
A simple function that checks if the given filename exists.
================================
*/
int fileExists(const char *filename) {
struct stat buffer;
return (stat (filename, &buffer) == 0);
}

9
engine/fio.h 100644
View File

@ -0,0 +1,9 @@
#ifndef FIO_H
#define FIO_H
#include "llist.h"
#define F_DIRS 1
#define F_FILES 2
struct LList *dirToLList(const char *dir_name, int opts);
int fileExists(const char *filename);
#endif

View File

@ -3,11 +3,14 @@
#include "ts_event.h"
#include "state_menu.h"
#include "../data.h"
#include "llist.h"
struct Table *g_settings;
int g_running;
struct LList *g_modules_list;
/* video-related globals */
void *g_screen; // void pointer for SDL_Surface or others, set by interface
int g_video_width;

20
engine/llist.c 100644
View File

@ -0,0 +1,20 @@
/****** llist.c
This file contains the functions for accessing and manipulating the linked list struct, LList.
******/
#include <stdlib.h>
#include "llist.h"
struct LList *newLList() {
struct LList *llist = malloc(sizeof(struct LList));
llist->size = 0;
llist->next = NULL;
llist->data = NULL;
return llist;
}
int freeLList(struct LList *llist) {
if (llist->data != NULL)
free(llist->data);
free(llist);
return 0;
}

11
engine/llist.h 100644
View File

@ -0,0 +1,11 @@
#ifndef LLIST_H
#define LLIST_H
struct LList {
int size;
struct LList *next;
void *data;
};
struct LList *newLList();
int freeLList(struct LList *llist);
#endif

View File

@ -1,5 +1,6 @@
#include "globals.h"
#include "interfaces.h"
#include "fio.h"
int main(int argc, char *argv[]) {
// let's load in our config file
@ -19,6 +20,18 @@ int main(int argc, char *argv[]) {
addTablePairInt(g_settings, "v_framecap", 0);
addTablePairInt(g_settings, "tickrate", 40000000);
}
// let's search for modules!
if ((g_modules_list = dirToLList("modules", F_DIRS)) == NULL)
printf("ERR: no modules found\n");
printf("modules:\n");
struct LList *llist = g_modules_list;
while (llist) {
if (strcmp((char*)llist->data, getTablePairValueString(g_settings, "module")) == 0)
printf("* ");
printf("%s\n", (char*)llist->data);
llist = llist->next;
}
// initialize our interface system (ncurses, SDL, etc.)
if (interfaceInit() == 1) {
return 1;

View File

@ -1,3 +1,6 @@
;; module options
; name of last module loaded
module xibalba
;; video options
v_width 1024
v_height 768