/***************************************************************************** * 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) && (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 \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); }