/***************************************************************************** * Bible dictionary index utility */ #ifndef __GNUC__ #include #else #include #endif #include #include #include #include #include #include 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 \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); }