aboutsummaryrefslogtreecommitdiff
path: root/lib/filemap.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/filemap.c')
-rw-r--r--lib/filemap.c66
1 files changed, 65 insertions, 1 deletions
diff --git a/lib/filemap.c b/lib/filemap.c
index c43ba35..e797169 100644
--- a/lib/filemap.c
+++ b/lib/filemap.c
@@ -111,7 +111,7 @@ skipline(FILE *fp)
}
static int
-filemap_get(int dbg, void *data, const char *key, char **return_value)
+filemap_get_0(int dbg, void *data, const char *key, char **return_value)
{
struct filemap *filemap = data;
FILE *fp = filemap->fp;
@@ -161,6 +161,70 @@ filemap_get(int dbg, void *data, const char *key, char **return_value)
return rc;
}
+static int
+filemap_get_1(int dbg, void *data, const char *key, char **return_value)
+{
+ struct filemap *filemap = data;
+ FILE *fp = filemap->fp;
+ int line = 0;
+ int rc, c;
+ const char *p;
+ size_t len;
+
+ rewind(fp);
+ while ((c = getc(fp)) != EOF) {
+ line++;
+ while (c != EOF && (c == ' ' || c == '\t'))
+ c = getc(fp);
+ if (c == '\n')
+ continue;
+ if (c == '#') {
+ skipline(fp);
+ continue;
+ }
+ if (c == EOF)
+ break;
+ for (len = 0; c != EOF && c != ':'; len++)
+ c = getc(fp);
+ if (c == EOF)
+ break;
+ if (c == '\n')
+ continue;
+ if (c == ':') {
+ for (p = key, c = getc(fp), len++;
+ c != EOF && c != '\n' && *p == c;
+ p++, len++, c = getc(fp));
+ if (c == EOF || c == '\n')
+ break;
+ skipline(fp);
+ }
+ }
+
+ if (c == '\n') {
+ struct grecs_txtacc *acc;
+
+ debug(dbg, 2, ("%s:%d: found key", filemap->name, line));
+ fseek(fp, - (len + 1), SEEK_CUR);
+ acc = grecs_txtacc_create();
+ while ((c = getc(fp)) != EOF && c != ':')
+ grecs_txtacc_grow_char(acc, c);
+ grecs_txtacc_grow_char(acc, 0);
+ *return_value = grecs_txtacc_finish(acc, 1);
+ grecs_txtacc_free(acc);
+ rc = eclat_map_ok;
+ } else
+ rc = eclat_map_not_found;
+
+ return rc;
+}
+
+static int
+filemap_get(int dbg, int dir, void *data, const char *key, char **return_value)
+{
+ return (dir ? filemap_get_1 : filemap_get_0)(dbg, data, key,
+ return_value);
+}
+
struct eclat_map_drv eclat_map_drv_file = {
"file",
filemap_config,

Return to:

Send suggestions and report system problems to the System administrator.