diff options
author | Jon Bergli Heier <snakebite@jvnv.net> | 2009-08-14 02:05:59 +0200 |
---|---|---|
committer | Jon Bergli Heier <snakebite@jvnv.net> | 2009-08-14 02:05:59 +0200 |
commit | 6ca9bdc3559e541ad636d283a57ddf22d77b47cf (patch) | |
tree | 09ce862ae0c222996b756dc46994d40c4b926b0b | |
parent | 5acf08a2e540d68093566c006e45572849589750 (diff) | |
parent | bd1f1deafc7f1fec1612d3776377f685f056e5f7 (diff) |
Merge branch 'master' of ssh://athena/mnt/scm/git/ircstats
-rw-r--r-- | channel.c | 50 | ||||
-rw-r--r-- | channel.h | 7 | ||||
-rw-r--r-- | config.c | 6 | ||||
-rw-r--r-- | main.c | 22 |
4 files changed, 51 insertions, 34 deletions
@@ -22,45 +22,43 @@ struct channel_t *channel_add(const char *name) { } struct channel_t *channel = &channels[channel_count-1]; channel->name = strdup(name); - channel->file_count = 0; channel->files = NULL; return channel; } -int channel_set_file_count(struct channel_t *channel, int count) { - channel->files = malloc(count * sizeof(struct channel_file_t)); - if(!channel->files) { - char *error = strerror(errno); - fprintf(stderr, "Could not allocate memory for channel files (%s): %s\n", channel->name, error); - return 0; - } - channel->file_count = count; - return 1; -} - -int channel_set_file(struct channel_t *channel, int index, const char *path, int rs_index) { - struct channel_file_t *file; - /* Make sure index is in range. */ - if(!(index < channel->file_count)) - return 0; - file = &channel->files[index]; +struct channel_file_t *channel_file_add(struct channel_t *channel, const char *path, int rs_index) { + struct channel_file_t *file = malloc(sizeof(struct channel_file_t)); + struct channel_file_t *last = channel->files; + if(last) { + while(last->next) last = last->next; + last->next = file; + } else + channel->files = file; file->path = strdup(path); file->rs = rs_get(rs_index); - /* Fail if we don't get a regex set. */ + file->next = NULL; if(!file->rs) - return 0; - return 1; + return NULL; + return file; +} + +int channel_get_count() { + return channel_count; +} + +struct channel_t *channel_get(int index) { + return (index < channel_count ? &channels[index] : NULL); } void channel_free() { for(int i = 0; i < channel_count; i++) { free(channels[i].name); - /* Free all file path strings. */ - for(int j = 0; j < channels[i].file_count; j++) { - free(channels[i].files[j].path); + struct channel_file_t *file = channels[i].files; + while(file) { + struct channel_file_t *next = file->next; + free(file); + file = next; } - /* 'files' is a dynamically allocated array, must be freed. */ - free(channels[i].files); } free(channels); channels = NULL; @@ -6,18 +6,19 @@ struct channel_file_t { char *path; struct regexset_t *rs; + struct channel_file_t *next; }; struct channel_t { char *name; - int file_count; struct channel_file_t *files; }; void channel_init(); struct channel_t *channel_add(const char *name); -int channel_set_file_count(struct channel_t *channel, int count); -int channel_set_file(struct channel_t *channel, int index, const char *path, int rs_index); +struct channel_file_t *channel_file_add(struct channel_t *channel, const char *path, int rs_index); +int channel_get_count(); +struct channel_t *channel_get(int index); void channel_free(); #endif @@ -59,7 +59,6 @@ int cfg_init() { sprintf(sname, "channel #%d", i+1); name = sname; } - printf("Channel %s\n", name); struct channel_t *channel; if(!(channel = channel_add(name))) { return 0; @@ -70,9 +69,6 @@ int cfg_init() { continue; } int file_count = config_setting_length(files); - /* Break if we can't set file count, most likely any following channels will also fail. */ - if(!channel_set_file_count(channel, file_count)) - break; /* Iterate through files. */ for(int j = 0; j < file_count; j++) { const char *filepath; @@ -96,7 +92,7 @@ int cfg_init() { filepath = config_setting_get_string(file); rs_index = 0; } - if(!channel_set_file(channel, j, filepath, rs_index)) { + if(!channel_file_add(channel, filepath, rs_index)) { fprintf(stderr, "Failed to set file #%d (%s) for channel %s.\n", j+1, filepath, name); } } @@ -17,6 +17,28 @@ int main(int argc, char **argv) { } /* Parsing stuff goes here. */ + for(int chan_i = 0; chan_i < channel_get_count(); chan_i++) { + struct channel_t *channel = channel_get(chan_i); + printf("Channel %s\n", channel->name); + struct channel_file_t *file = channel->files; + while(file) { + struct regexset_t *rs = file->rs; + FILE *f = fopen(file->path, "r"); + if(!f) { + fprintf(stderr, "\tFailed to open %s\n", file->path); + file = file->next; + continue; + } else + printf("\tParsing %s\n", file->path); + + char line[0x2ff]; + while(fgets(line, 0x2ff, f)) { + // TODO: Magic. + } + + file = file->next; + } + } cfg_free(); channel_free(); |