diff options
Diffstat (limited to 'utilities/txt2sword.cpp')
-rw-r--r-- | utilities/txt2sword.cpp | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/utilities/txt2sword.cpp b/utilities/txt2sword.cpp new file mode 100644 index 0000000..c373f30 --- /dev/null +++ b/utilities/txt2sword.cpp @@ -0,0 +1,233 @@ +#include <stdio.h> +#include <fcntl.h> +#include <string.h> +#include <unistd.h> +#include <ctype.h> +#include <versekey.h> +#include <sys/stat.h> +#include <iostream> +const long MAXVLEN = 8192; + +int fp, vfp, cfp, bfp, dfp; +short size; + +void ProcessFile (char *fileName, char *testament); +char getVerse (int fp, int *verseNum, char *verseBuf, char testament); +void filterVerse (char *text, char lang); +void openFiles (char *fileName); + +int main (int argc, char **argv) { + if (argc == 3) + ProcessFile(argv[1], argv[2]); + else + ProcessFile(argv[1], "ot"); + return 0; +}; + +void ProcessFile(char *fileName, char *testament) +{ + unsigned long pos = 0L; + unsigned short size = 0, tmp; + int verseNum, curbook = 0, curchap = 0, curverse = 0, curTestament = 1; + char buf[127]; + VerseKey mykey; + char verseBuf[MAXVLEN]; + bool fail = false; + char end = 0; + + if ((fp = open(fileName, O_RDONLY)) == -1) { + sprintf(buf, "Couldn't open file: %s\n", fileName); + printf(buf); + return; + } + + if (!strcmp(testament, "nt")) { + openFiles("nt"); + + mykey = "Matthew 1:1"; + } else { + openFiles("ot"); + + mykey = "Genesis 1:1"; + } + + // getVerse(fp, &verseNum, verseBuf, 1); + do { + end = getVerse(fp, &verseNum, verseBuf, mykey.Testament()); + + if (mykey.Verse() == 1) { /* if we're at a new chapter */ + if (mykey.Chapter() == 1) { /* if we're at a new book */ + if (mykey.Testament() != curTestament) { // we've made it to new testament + curTestament = mykey.Testament(); + close(vfp); // verse + close(cfp); // chapter + close(bfp); // book + close(dfp); // data + openFiles("nt"); + } + + pos = lseek(cfp, 0, SEEK_CUR); + write(bfp, &pos, 4); + pos = lseek(vfp, 0, SEEK_CUR); /* Book intro (cps) */ + write(cfp, &pos, 4); + pos = 0L; + tmp = 0; + write(vfp, &pos, 4); /* Book intro (vss) */ + write(vfp, &tmp, 2); + curbook++; + curchap = 0; + } + pos = lseek(vfp, 0, SEEK_CUR); + write(cfp, &pos, 4); + curverse = 1; + pos = 0L; + tmp = 0; + write(vfp, &pos, 4); /* Chapter intro */ + write(vfp, &tmp, 2); + curchap++; + } + else curverse++; + + if (mykey.Chapter() != curchap) { + sprintf(buf, "Error: Found chaptures out of sequence\n"); + printf(buf); + fail = true; + break; + } + if ((mykey.Verse() != curverse) || (curverse != verseNum)) { + printf("Error: Found verses out of sequence"); + sprintf(buf, "Expected %d (%s), but got %d\n\n", curverse, (const char *)mykey, verseNum); + printf(buf); + printf(" Currently SWORD only supports KJV verse numbering and book ordering.\n"); + printf(" Try combining extra verses with the last valid verse just before.\n"); + printf(" This way, even though they will display in SWORD along with the previous verse, all data will be displayed.\n"); + printf(" Where verses are missing, add a blank entry.\n"); + printf(" Then try rerunning\n"); + fail = true; + break; + } + + pos = lseek(dfp, 0, SEEK_CUR); + write(vfp, &pos, 4); + size = strlen(verseBuf); + write(vfp, &size, 2); + sprintf(buf, "%2d:%3d:%3d (%s) found at offset: %7ld; size: %d\n", curbook, mykey.Chapter(), mykey.Verse(), (const char *)mykey, pos, size); + printf(buf); + if (size > 1000) { + printf("WARNING: Strange Size."); + } + write(dfp, verseBuf, size); + mykey++; + } while (!end); + + close(vfp); // verse + close(cfp); // chapter + close(bfp); // book + close(dfp); // data + close(fp); // source + if (!fail) + printf("SUCCESS!!!!!!!"); +} + + +char getVerse(int fp, int *verseNum, char *verseBuf, char testament) +{ + int retVal = 1; + int tvn = 0; + char * temp_char = new char[2]; + temp_char[1] = 0; + *verseBuf = 0; + + while (1) { + retVal = read(fp, temp_char, 1); + + if (isdigit(temp_char[0])) + tvn = (10 * tvn) + temp_char[0] - '0'; + else + break; + } + std::cout << tvn << " "; + *verseNum = tvn; + + while (1) { + retVal = read(fp, temp_char, 1); + if (temp_char[0] == 10 || temp_char[0] == 13) + break; + else + strcat (verseBuf, temp_char); + } + strcat (verseBuf, "\n"); + + std::cout << verseBuf; + + if (retVal) + retVal = 0; + else + retVal = 1; + + delete temp_char; + return retVal; +} + +void openFiles(char *fileName) +{ + char buf[128]; + long pos; + short size; + + unlink(fileName); + if ((dfp = open(fileName, O_CREAT|O_WRONLY, S_IREAD|S_IWRITE)) == -1) { + sprintf(buf, "Couldn't open file: %s\n", fileName); + printf(buf); + return; + } + + sprintf(buf, "%s.vss", fileName); + unlink(buf); + if ((vfp = open(buf, O_CREAT|O_WRONLY, S_IREAD|S_IWRITE)) == -1) { + sprintf(buf, "Couldn't open file: %s\n", buf); + printf(buf); + return; + } + + sprintf(buf, "%s.cps", fileName); + unlink(buf); + if ((cfp = open(buf, O_CREAT|O_WRONLY, S_IREAD|S_IWRITE)) == -1) { + sprintf(buf, "Couldn't open file: %s\n", buf); + printf(buf); + return; + } + + sprintf(buf, "%s.bks", fileName); + unlink(buf); + if ((bfp = open(buf, O_CREAT|O_WRONLY, S_IREAD|S_IWRITE)) == -1) { + sprintf(buf, "Couldn't open file: %s\n", buf); + printf(buf); + return; + } + pos = 0; + write(bfp, &pos, 4); /* Book offset for testament intros */ + pos = 4; + write(cfp, &pos, 4); /* Chapter offset for testament intro */ + + +/* Right now just zero out intros until parsing correctly */ + pos = 0; + size = 0; + write(vfp, &pos, 4); /* Module intro */ + write(vfp, &size, 2); + write(vfp, &pos, 4); /* Testament intro */ + write(vfp, &size, 2); +} + + + + + + + + + + + + |