X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/agedu/blobdiff_plain/70322ae3751bc07ac749dffad79a5f3420e67b55..704fafa3ca85f378c91f8b1fdd3dfd9f34d02c8c:/trie.c diff --git a/trie.c b/trie.c index f0b21df..0466a34 100644 --- a/trie.c +++ b/trie.c @@ -16,6 +16,8 @@ #define alignof(typ) ( offsetof(struct { char c; typ t; }, t) ) +extern char pathsep; + /* * Compare functions for pathnames. Returns the relative order of * the names, like strcmp; also passes back the offset of the @@ -23,9 +25,9 @@ */ static int trieccmp(unsigned char a, unsigned char b) { - a = (a == '\0' ? '\0' : a == '/' ? '\1' : a+1); - b = (b == '\0' ? '\0' : b == '/' ? '\1' : b+1); - return a - b; + a = (a == '\0' ? '\0' : a == pathsep ? '\1' : a+1); + b = (b == '\0' ? '\0' : b == pathsep ? '\1' : b+1); + return (int)a - (int)b; } static int triencmp(const char *a, size_t alen, @@ -108,6 +110,7 @@ struct trie_header { off_t root, indexroot; int count; size_t maxpathlen; + int pathsep; }; /* Union only used for computing alignment */ @@ -198,6 +201,7 @@ triebuild *triebuild_new(int fd) th.root = th.count = 0; th.indexroot = 0; th.maxpathlen = 0; + th.pathsep = (unsigned char)pathsep; tb_seek(tb, 0); tb_write(tb, &th, sizeof(th)); @@ -373,6 +377,7 @@ int triebuild_finish(triebuild *tb) th.root = triebuild_unwind(tb, 0, &th.count); th.indexroot = 0; th.maxpathlen = tb->maxpathlen; + th.pathsep = (unsigned char)pathsep; tb_seek(tb, 0); tb_write(tb, &th, sizeof(th)); @@ -494,6 +499,12 @@ unsigned long trie_count(const void *t) return hdr->count; } +char trie_pathsep(const void *t) +{ + const struct trie_header *hdr = NODE(t, 0, trie_header); + return (char)hdr->pathsep; +} + struct triewalk_switch { const struct trie_switch *sw; int pos, depth, count; @@ -606,3 +617,12 @@ off_t trie_get_index_offset(const void *t) { return ((const struct trie_header *)t)->indexroot; } + +void make_successor(char *pathbuf) +{ + int len = strlen(pathbuf); + if (len > 0 && pathbuf[len-1] == pathsep) + len--; + pathbuf[len] = '\001'; + pathbuf[len+1] = '\0'; +}