//
-int
-rxpd_file_load (struct rxpd_base* base, const char* filename)
+struct rxpd_file*
+rxpd_file_new (struct rxpd_base* base, const char* filename)
{
char buf[4096];
+ struct rxpd_file* self = NULL;
// TODO better filenname validation / error handling
if (!filename ||
strchr (filename, '/') ||
strlen (filename) + strlen (base->rulesdir) > 4097)
- abort();
+ return NULL;
strcpy (buf, base->rulesdir);
strcat (buf, filename);
filename = strdup (buf);
-
- struct rxpd_file* file = malloc (sizeof (struct rxpd_file));
- if (!file || !filename) abort();
-
- psplay_init (&file->node, filename);
- llist_init (&file->rules);
-
- FILE* f = fopen (filename, "r");
- // TODO error handling
- if (!f) abort();
-
- // TODO test excess line length = error
- while (fgets (buf, 4096, f))
+ if (filename)
{
- size_t last = strlen(buf);
- if (buf[last-1] == '\n')
- buf[last-1] = '\0';
-
- struct rxpd_rule* rule;
- rule = rxpd_rule_new (buf);
- if (!rule)
- abort();
-
-
- printf("%s\n", rule->string);
+ self = malloc (sizeof (struct rxpd_file));
+ if (self)
+ {
+ psplay_init (&self->node, filename);
+ llist_init (&self->rules);
- llist_insert_tail (&file->rules, &rule->node);
+ psplay_insert (&base->files, &self->node);
+ }
}
-
- fclose (f);
-
- psplay_insert (&base->files, &file->node);
-
- return 0;
+ return self;
}
void
}
}
+int
+rxpd_file_load (struct rxpd_file* self)
+{
+ const char* filename = self->node.key;
+
+ FILE* f = fopen (filename, "r");
+ // TODO error handling
+ if (f)
+ {
+ // TODO test excess line length = error
+ char buf[4096];
+
+ while (fgets (buf, 4096, f))
+ {
+ size_t last = strlen(buf);
+ if (buf[last-1] == '\n')
+ buf[last-1] = '\0';
+
+ struct rxpd_rule* rule;
+ rule = rxpd_rule_new (buf);
+ if (!rule)
+ abort();
+
+ printf("%s\n", rule->string);
+
+ llist_insert_tail (&self->rules, &rule->node);
+ }
+
+ fclose (f);
+ return 1;
+ }
+ else
+ return 0;
+}
+
int
rxpd_file_cmp (const void* A, const void* B)
{