summaryrefslogtreecommitdiff
path: root/channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'channel.c')
-rw-r--r--channel.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/channel.c b/channel.c
new file mode 100644
index 0000000..cab4612
--- /dev/null
+++ b/channel.c
@@ -0,0 +1,67 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include "channel.h"
+
+struct channel_t *channels;
+int channel_count;
+
+void channel_init() {
+ channels = NULL;
+ channel_count = 0;
+}
+
+struct channel_t *channel_add(const char *name) {
+ channels = realloc(channels, ++channel_count * sizeof(struct regexset_t));
+ if(!channels) {
+ char *error = strerror(errno);
+ fprintf(stderr, "Could not (re)allocate memory for channels: %s\n", error);
+ return NULL;
+ }
+ 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];
+ file->path = strdup(path);
+ file->rs = rs_get(rs_index);
+ /* Fail if we don't get a regex set. */
+ if(!file->rs)
+ return 0;
+ return 1;
+}
+
+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);
+ }
+ /* 'files' is a dynamically allocated array, must be freed. */
+ free(channels[i].files);
+ }
+ free(channels);
+ channels = NULL;
+}