Skip to content

Commit

Permalink
No longer using nested functions since they don't seem to working usi…
Browse files Browse the repository at this point in the history
…ng llvm-gcc-4.2. Replaced with userdata params
  • Loading branch information
krumberg committed Apr 14, 2012
1 parent 6d24fad commit 8c05dc0
Show file tree
Hide file tree
Showing 10 changed files with 92 additions and 40 deletions.
34 changes: 21 additions & 13 deletions src/apps/pcmount/fuse.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,26 +54,34 @@ static int podcastfs_getattr(const char* path, struct stat *stbuf)
return 0;
}

static int podcastfs_readdir(const char* path, void* buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info* fi)
struct filler_param {
fuse_fill_dir_t filler;
void* buf;
};

void fill_callback(const char* item, void* userdata)
{
debuglog("Inside podcastfs_readdir");
debuglog(path);
struct filler_param* fp = (struct filler_param*) userdata;

void callback(const char* item)
{
debuglog(item);
filler(buf, item, NULL, 0);
}
debuglog(item);
fp->filler(fp->buf, item, NULL, 0);
}

static int podcastfs_readdir(const char* path, void* buf, fuse_fill_dir_t filler,
off_t offset, struct fuse_file_info* fi)
{
PodcastList* list = podcastlist_get_instance();

struct filler_param fp = {0,};
fp.filler = filler;
fp.buf = buf;

if (strcmp(path, "/") == 0) {
callback(".");
callback("..");
podcastlist_foreach_foldername(list, callback);
fill_callback(".", &fp);
fill_callback("..", &fp);
podcastlist_foreach_foldername(list, fill_callback, &fp);
} else if (podcastlist_is_podcast_folder(list, (path + 1))) {
podcastlist_foreach_trackname_in_folder(list, path, callback);
podcastlist_foreach_trackname_in_folder(list, path, fill_callback, &fp);
} else {
debuglog("podcastfs_readdir failed on path");
debuglog(path);
Expand Down
4 changes: 2 additions & 2 deletions src/apps/testpodcastlist/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@
#include <stdio.h>
#include <podcast/podcastlist.h>

static void print_foldername(const gchar* foldername)
static void print_foldername(const gchar* foldername, void* userdata)
{
puts(foldername);
}

int main(int argc, char *argv[])
{
PodcastList* list = podcastlist_get_instance();
podcastlist_foreach_foldername(list, print_foldername);
podcastlist_foreach_foldername(list, print_foldername, NULL);
return 0;
}
4 changes: 2 additions & 2 deletions src/apps/testxmlparsing/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@
#include <stdio.h>
#include <podcast/podcast.h>

static void print_filename(const gchar* filename)
static void print_filename(const gchar* filename, void* userdata)
{
puts(filename);
}

int main(int argc, char *argv[])
{
Podcast* pcast = podcast_new_from_file("Ekots_lordagsintervju.xml");
podcast_foreach_trackname(pcast, print_filename);
podcast_foreach_trackname(pcast, print_filename, NULL);
return 0;
}
11 changes: 6 additions & 5 deletions src/libs/debuglog/debuglog.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,17 @@
#include <stdio.h>
#include <stdlib.h>

static FILE* file = NULL;

static void closefile() {
fclose(file);
}

void debuglog(const char* line, ...)
{
static FILE* file = NULL;

if (file == NULL) {
file = fopen("debug.txt", "wt");

void closefile() {
fclose(file);
}
atexit(closefile);
}

Expand Down
32 changes: 27 additions & 5 deletions src/libs/podcast/podcast.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,18 +162,40 @@ void podcast_free(Podcast* pcast)
}
}

static gboolean foreach_callback (gpointer key, gpointer value, gpointer user_data)
static void count_callback(const gchar* filename, void* userparam)
{
pc_foreachname_callback callback = (pc_foreachname_callback) user_data;
int* nump = (int*) userparam;

callback((gchar*)key);
++(*nump);
}

size_t podcast_num_tracks(Podcast* podcast)
{
size_t num = 0;

if (podcast) {
podcast_foreach_trackname(podcast, count_callback, &num);
}

return num;
}

static gboolean foreach_callback (gpointer key, gpointer value, gpointer userdata)
{
pc_foreachname_callback_and_param* cap = (pc_foreachname_callback_and_param*) userdata;

cap->callback((gchar*)key, cap->userdata);

return FALSE;
}

void podcast_foreach_trackname(Podcast* pcast, pc_foreachname_callback callback)
void podcast_foreach_trackname(Podcast* pcast, pc_foreachname_callback callback, void* userdata)
{
g_tree_foreach(pcast->podcasttrack_tree, foreach_callback, callback);
pc_foreachname_callback_and_param cap = {0,};
cap.callback = callback;
cap.userdata = userdata;

g_tree_foreach(pcast->podcasttrack_tree, foreach_callback, &cap);
}

PodcastTrack* podcast_get_track(Podcast* pcast, const gchar* track_name)
Expand Down
11 changes: 9 additions & 2 deletions src/libs/podcast/podcast.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,22 @@

#include <podcast/podcasttrack.h>

typedef void (*pc_foreachname_callback)(const gchar* name);
typedef void (*pc_foreachname_callback)(const gchar* name, void* userparam);

typedef struct {
pc_foreachname_callback callback;
void* userdata;
} pc_foreachname_callback_and_param;

typedef struct Podcast Podcast;

Podcast* podcast_new_from_file(const gchar* file);
Podcast* podcast_new_from_url(const gchar* url);
void podcast_free(Podcast* pcast);

void podcast_foreach_trackname(Podcast* pcast, pc_foreachname_callback callback);
size_t podcast_num_tracks(Podcast* podcast);

void podcast_foreach_trackname(Podcast* pcast, pc_foreachname_callback callback, void* userdata);
gboolean podcast_has_track(Podcast* pcast, const gchar* track_name);
PodcastTrack* podcast_get_track(Podcast* pcast, const gchar* track_name);
const gchar* podcast_folder_name(Podcast* pcast);
Expand Down
18 changes: 11 additions & 7 deletions src/libs/podcast/podcastlist.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ gboolean podcastlist_is_podcast_track(PodcastList* list, const gchar* folder_and
}

void podcastlist_foreach_trackname_in_folder(PodcastList* list, const gchar* name,
pc_foreachname_callback callback)
pc_foreachname_callback callback, void* userdata)
{
debuglog("Enter podcastlist_foreach_trackname_in_folder");

Expand All @@ -148,29 +148,33 @@ void podcastlist_foreach_trackname_in_folder(PodcastList* list, const gchar* nam

debuglog("About to call podcastlist_foreach_trackname");

podcast_foreach_trackname(pcast, callback);
podcast_foreach_trackname(pcast, callback, userdata);
}

static gboolean foreach_callback (gpointer key, gpointer value, gpointer user_data)
static gboolean foreach_callback (gpointer key, gpointer value, gpointer userdata)
{
debuglog("Called foreach_ghash_callback");

pc_foreachname_callback callback = (pc_foreachname_callback) user_data;
pc_foreachname_callback_and_param* cap = (pc_foreachname_callback_and_param*) userdata;

callback((gchar*)key);
cap->callback((gchar*)key, cap->userdata);

debuglog("Left foreach_ghash_callback");

return FALSE;
}

void podcastlist_foreach_foldername(PodcastList* list, pc_foreachname_callback callback)
void podcastlist_foreach_foldername(PodcastList* list, pc_foreachname_callback callback, void* userdata)
{
debuglog("Enter podcastlist_foreach_foldername");
assert(list!=NULL);
assert(list->podcast_tree!=NULL);

g_tree_foreach(list->podcast_tree, foreach_callback, callback);
pc_foreachname_callback_and_param cap = {0,};
cap.callback = callback;
cap.userdata = userdata;

g_tree_foreach(list->podcast_tree, foreach_callback, &cap);
debuglog("Leaving podcastlist_foreach_foldername");
}

Expand Down
4 changes: 2 additions & 2 deletions src/libs/podcast/podcastlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ PodcastList* podcastlist_get_instance();
gboolean podcastlist_is_podcast_folder(PodcastList* list, const char* name);
gboolean podcastlist_is_podcast_track(PodcastList* list, const char* folder_and_track);

void podcastlist_foreach_trackname_in_folder(PodcastList* list, const char* name, pc_foreachname_callback callback);
void podcastlist_foreach_foldername(PodcastList* list, pc_foreachname_callback callback);
void podcastlist_foreach_trackname_in_folder(PodcastList* list, const char* name, pc_foreachname_callback callback, void* userdata);
void podcastlist_foreach_foldername(PodcastList* list, pc_foreachname_callback callback, void* userdata);

size_t podcastlist_get_track_size(PodcastList* list, const char* folder_and_item);
int podcastlist_read_track(PodcastList* list, const char* folder_and_item, char* buf, size_t size, size_t offset);
Expand Down
12 changes: 12 additions & 0 deletions src/test/integration-tests/podcast-integration-tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,15 @@ TEST(podcast_integration_tests, from_file_read_name)

podcast_free(podcast);
}

TEST(podcast_integration_tests, from_file_count)
{
const char* TESTRSS_FILE = "src/test/data/testrss.xml";

Podcast* podcast = podcast_new_from_file(TESTRSS_FILE);
ASSERT_TRUE(podcast != NULL);

ASSERT_EQ(10, podcast_num_tracks(podcast));

podcast_free(podcast);
}
2 changes: 0 additions & 2 deletions src/toolchain/darwin.toolchain
Original file line number Diff line number Diff line change
@@ -1,2 +0,0 @@
# OS X llvm-gcc-4.2 needs these flags
set(TOOLCHAIN_C_FLAGS "-fnested-functions")

0 comments on commit 8c05dc0

Please sign in to comment.