summaryrefslogtreecommitdiffstats
path: root/misc/ojbtxidx.c
diff options
context:
space:
mode:
authorTroy A. Griffitts <scribe@crosswire.org>2005-05-03 11:19:27 +0000
committerTroy A. Griffitts <scribe@crosswire.org>2005-05-03 11:19:27 +0000
commita417505f974a374f38b9899a9adf0c79e121d762 (patch)
tree69b26d889ffb7f5e7ef778b35609afa0d33ae1fb /misc/ojbtxidx.c
parent3a69f07c65abe0bfa32f0e22ffcc657bc7342ea5 (diff)
downloadsword-tools-a417505f974a374f38b9899a9adf0c79e121d762.tar.gz
Moved misc tools from sword repo, to here.
git-svn-id: https://www.crosswire.org/svn/sword-tools/trunk@36 07627401-56e2-0310-80f4-f8cd0041bdcd
Diffstat (limited to 'misc/ojbtxidx.c')
-rw-r--r--misc/ojbtxidx.c166
1 files changed, 166 insertions, 0 deletions
diff --git a/misc/ojbtxidx.c b/misc/ojbtxidx.c
new file mode 100644
index 0000000..f70cc01
--- /dev/null
+++ b/misc/ojbtxidx.c
@@ -0,0 +1,166 @@
+#include <stdio.h>
+#include <fcntl.h>
+#ifndef __GNUC__
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+
+char findbreak(int fd, long *offset, int *num1, int *num2, short *size);
+
+
+main(int argc, char **argv)
+{
+ int fd, vfd, cfd, bfd;
+ long pos, offset;
+ short size, tmp;
+ int num1, num2, curbook = 0, curchap = 0, curverse = 0;
+ char buf[127];
+
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s <file to process>\n", argv[0]);
+ exit(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
+ if ((fd = open(argv[1], O_RDONLY|O_BINARY)) == -1) {
+ fprintf(stderr, "Couldn't open file: %s\n", argv[1]);
+ exit(1);
+ }
+
+ sprintf(buf, "%s.vss", argv[1]);
+ if ((vfd = open(buf, O_CREAT|O_WRONLY|O_BINARY)) == -1) {
+ fprintf(stderr, "Couldn't open file: %s\n", buf);
+ exit(1);
+ }
+
+ sprintf(buf, "%s.cps", argv[1]);
+ if ((cfd = open(buf, O_CREAT|O_WRONLY|O_BINARY)) == -1) {
+ fprintf(stderr, "Couldn't open file: %s\n", buf);
+ exit(1);
+ }
+
+ sprintf(buf, "%s.bks", argv[1]);
+ if ((bfd = open(buf, O_CREAT|O_WRONLY|O_BINARY)) == -1) {
+ fprintf(stderr, "Couldn't open file: %s\n", buf);
+ exit(1);
+ }
+
+ pos = 0;
+ write(bfd, &pos, 4); /* Book offset for testament intros */
+ pos = 4;
+ write(cfd, &pos, 4); /* Chapter offset for testament intro */
+
+
+/* Right now just zero out intros until parsing correctly */
+ pos = 0;
+ size = 0;
+ write(vfd, &pos, 4); /* Module intro */
+ write(vfd, &size, 2);
+ write(vfd, &pos, 4); /* Testament intro */
+ write(vfd, &size, 2);
+
+ while (!findbreak(fd, &offset, &num1, &num2, &size)) {
+
+ if (num2 == 1) { /* if we're at a new chapter */
+ if (num1 == 1) { /* if we're at a new book */
+ pos = lseek(cfd, 0, SEEK_CUR);
+ write(bfd, &pos, 4);
+ pos = lseek(vfd, 0, SEEK_CUR); /* Book intro (cps) */
+ write(cfd, &pos, 4);
+ pos = 0;
+ tmp = 0;
+ write(vfd, &pos, 4); /* Book intro (vss) */
+ write(vfd, &tmp, 2);
+ curbook++;
+ curchap = 0;
+ }
+ pos = lseek(vfd, 0, SEEK_CUR);
+ write(cfd, &pos, 4);
+ curverse = 1;
+ pos = 0;
+ tmp = 0;
+ write(vfd, &pos, 4); /* Chapter intro */
+ write(vfd, &tmp, 2);
+ curchap++;
+ }
+ else curverse++;
+
+ printf("%2d:%3d:%3d found at offset: %7ld\n", curbook, num1, num2, offset);
+
+ if (num1 != curchap) {
+ fprintf(stderr, "Error: Found chaptures out of sequence (%2d:%3d:%3d)\n", curbook, num1-1, num2);
+ curchap = num1;
+// break;
+ }
+ if (num2 != curverse) {
+ fprintf(stderr, "Error: Found verses out of sequence (%2d:%3d:%3d)\n", curbook, num1, num2-1);
+// break;
+ tmp = 0;
+ curverse = num2;
+ write(vfd, &offset, 4);
+ write(vfd, &tmp, 2);
+ }
+ write(vfd, &offset, 4);
+ write(vfd, &size, 2);
+ }
+
+ close(vfd);
+ close(cfd);
+ close(bfd);
+ close(fd);
+ return 0;
+}
+
+
+char findbreak(int fd, long *offset, int *num1, int *num2, short *size)
+{
+ char buf[8];
+ char buf2[7];
+ char loop, len, star;
+
+ memset(buf, ' ', 7);
+ buf[7] = 0;
+
+ while (1) {
+
+ memmove(buf, &buf[1], 6);
+ if (read(fd, &buf[6], 1) != 1)
+ return 1;
+
+ if ((buf[0] == 10) && ((buf[2] == '*') || (buf[3] == '*') || (buf[4] == '*'))) {
+ star = 0;
+ for (loop = 0; loop < 7; loop++) {
+ if (buf[loop] == '*')
+ star = 1;
+ if (isdigit(buf[loop])&&star)
+ break;
+ else buf[loop] = ' ';
+ }
+ if (loop < 7) {
+ sscanf(buf, "%d", num1);
+ continue;
+ }
+ }
+
+ if ((buf[0] == '|') && (isdigit(buf[1]))) {
+ sscanf(&buf[1], "%d", num2);
+ sprintf(buf, "%d", *num2);
+ (*offset) = lseek(fd, 0, SEEK_CUR);
+ (*offset) -= (4-strlen(buf));
+
+ for (len = 1; len == 1; len = read(fd, &loop, 1)) {
+ if (loop == '|')
+ break;
+ }
+
+ *size = (short)(lseek(fd, 0, SEEK_CUR) - *offset) - 1;
+ lseek(fd, -1, SEEK_CUR);
+ break;
+ }
+ }
+ return 0;
+}
+