summaryrefslogtreecommitdiff
path: root/src/modules/lexdict/rawld/rawldidx.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/lexdict/rawld/rawldidx.c')
-rw-r--r--src/modules/lexdict/rawld/rawldidx.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/modules/lexdict/rawld/rawldidx.c b/src/modules/lexdict/rawld/rawldidx.c
new file mode 100644
index 0000000..cc4709c
--- /dev/null
+++ b/src/modules/lexdict/rawld/rawldidx.c
@@ -0,0 +1,96 @@
+/*****************************************************************************
+ * 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) && (buf[1] == '$') && (buf[2] == '$')) {
+ while (read(fd, buf, 1) == 1) {
+ if (*buf == 10) {
+ if (read(fd, buf, 1) == 1) {
+ *offset = lseek(fd, 0, SEEK_CUR);
+ rc = 0;
+ if (size) {
+ if (!findbreak(fd, &offset2, 0))
+ *size = offset2 - *offset - 13;
+ 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;
+
+ 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);
+
+#ifndef O_BINARY // O_BINARY is for Borland to be happy. If we're in GNU, just define it to a NULL mask
+#define O_BINARY 0
+#endif
+ sprintf(buf, "%s.dat", argv[1]);
+ fd = open(buf, O_RDONLY|O_BINARY);
+
+ sprintf(buf, "%s.idx", argv[1]);
+ ifd = open(buf, O_CREAT|O_WRONLY|O_BINARY);
+
+ 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);
+
+ buf[3] = 0; /* delimit string for read below */
+
+ while(!findbreak(fd, &offset, &size)) {
+ write(ifd, &offset, 4);
+ write(ifd, &size, 2);
+ read(fd, buf, 3);
+ printf("Found: %s...(%ld:%d)\n", buf, offset, size);
+ }
+
+ free(buf);
+
+ close(ifd);
+ close(fd);
+}