diff options
Diffstat (limited to 'misc/strongsidx.c')
-rw-r--r-- | misc/strongsidx.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/misc/strongsidx.c b/misc/strongsidx.c new file mode 100644 index 0000000..61bcda3 --- /dev/null +++ b/misc/strongsidx.c @@ -0,0 +1,90 @@ +/***************************************************************************** + * Bible dictionary index utility + */ + + +#ifndef __GNUC__ +#include <io.h> +#else +#include <unistd.h> +#endif + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + + +char findbreak(int fd, long *offset, short *size) +{ + char buf[3]; + char rc = 1; + long offset2; + + memset(buf, 0, sizeof(buf)); + + while (read(fd, &buf[sizeof(buf)-1], 1) == 1) { + if ((buf[0] == 10) && (isdigit(buf[1])) && (isdigit(buf[2]))) { + if (read(fd, buf, 1) == 1) { + *offset = lseek(fd, 0, SEEK_CUR) - 3; + rc = 0; + if (size) { + if (!findbreak(fd, &offset2, 0)) + *size = offset2 - *offset; + else *size = lseek(fd, 0, SEEK_END) - *offset; + lseek(fd, *offset, SEEK_SET); + } + break; + } + break; + } + memmove(buf, &buf[1], sizeof(buf)-1); + } + return rc; +} + + +void main(int argc, char **argv) +{ + int fd, ifd; + long offset; + short size; + char *buf; + char entbuf[6]; + + if (argc < 2) { + fprintf(stderr, "usage: %s <file to process (no .dat)>\n", argv[0]); + exit(1); + } + + buf = (char *) calloc(strlen(argv[1]) + 5, 1); + + sprintf(buf, "%s.dat", argv[1]); + fd = open(buf, O_RDONLY); + + sprintf(buf, "%s.idx", argv[1]); + ifd = open(buf, O_CREAT|O_WRONLY); + + offset = 0; /* write offset for intro */ + write(ifd, &offset, 4); + findbreak(fd, &offset, 0); + lseek(fd, 0L, SEEK_SET); + size = offset - 12; + write(ifd, &size, 2); + + entbuf[5] = 0; /* delimit string for read below */ + + while(!findbreak(fd, &offset, &size)) { + write(ifd, &offset, 4); + write(ifd, &size, 2); + read(fd, entbuf, 5); + printf("Found: %s...(%ld:%d)\n", entbuf, offset, size); + } + + free(buf); + + close(ifd); + close(fd); +} |