From c9458897ebbb739d8db83c80e06512d8a612f743 Mon Sep 17 00:00:00 2001 From: danglassey Date: Wed, 14 Aug 2002 09:57:17 +0000 Subject: *** empty log message *** --- olb/prn2swordfrm.cpp | 484 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 484 insertions(+) create mode 100644 olb/prn2swordfrm.cpp (limited to 'olb/prn2swordfrm.cpp') diff --git a/olb/prn2swordfrm.cpp b/olb/prn2swordfrm.cpp new file mode 100644 index 0000000..931c444 --- /dev/null +++ b/olb/prn2swordfrm.cpp @@ -0,0 +1,484 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "prn2swordfrm.h" +#include +#include +#include +#include +#include + +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +TForm2 *Form2; +const MAXVLEN = 8192; +//--------------------------------------------------------------------------- +__fastcall TForm2::TForm2(TComponent* Owner) + : TForm(Owner) +{ +} +//--------------------------------------------------------------------------- +void __fastcall TForm2::FSButtonClick(TObject *Sender) +{ + FSDialog->FileName = "*.rtf"; + char *fname; + + if (FSDialog->Execute()) { + FilePathEdit->Text = FSDialog->FileName; + } +} +//--------------------------------------------------------------------------- + + +void TForm2::ProcessFile(char *fileName) +{ + 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|O_BINARY)) == -1) { + sprintf(buf, "Couldn't open file: %s\n", fileName); + MessageBox(this->Handle, buf, "ProcessFile", MB_OK); + return; + } + + 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"); + } + Memo1->Text = ""; + 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"); + Memo1->Lines->Append(buf); + fail = true; + break; + } + if ((mykey.Verse() != curverse) || (curverse != verseNum)) { + Memo1->Lines->Append("Error: Found verses out of sequence"); + sprintf(buf, "Expected %d (%s), but got %d\n\n", curverse, (const char *)mykey, verseNum); + Memo1->Lines->Append(buf); + Memo1->Lines->Append(" Currently SWORD only supports KJV verse numbering and book ordering."); + Memo1->Lines->Append(" Try combining extra verses with the last valid verse just before, including it in footnote markers (eg. (24) verse text. (25) verse text)"); + Memo1->Lines->Append(" This way, even though they will display in SWORD along with the previous verse, all data will be displayed."); + Memo1->Lines->Append(" Where verses are missing, add a blank entry."); + Memo1->Lines->Append(" Then try rerunning"); + 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", curbook, mykey.Chapter(), mykey.Verse(), (const char *)mykey, pos, size); + Memo1->Lines->Append(buf); + if ((size < 0) || (size > 1000)) { + Memo1->Lines->Append("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) + Memo1->Lines->Append("SUCCESS!!!!!!!"); +} + + +char TForm2::getVerse(int fp, int *verseNum, char *verseBuf, char testament) +{ + char buf[21]; + char retVal = 0; + *verseNum=-1; + char *finalBuf = verseBuf; + int paridx; + const char *parchar = "\\par"; + + memset(buf, 0, 21); + + while (1) { + + if (!memcmp(buf, "\\f1 \\b0 \\fs22 \\f", 17)) { + if (isdigit(buf[18])) { + lseek(fp, -1, SEEK_CUR); + break; + } + else if (isdigit(buf[17])) { + lseek(fp, -2, SEEK_CUR); + break; + } + } + if (!memcmp(buf, "\\f1 \\b0 \\fs22 ", 14)) { + lseek(fp, -7, SEEK_CUR); + break; + } + if (!memcmp(buf, "\\li0\\fi0 \\par \\u", 16)) { + lseek(fp, -4, SEEK_CUR); + while(read(fp, buf, 1) == 1) { + if (*buf == 10) + break; + } + memset(buf, 0, 21); + } + memmove(buf, &buf[1], 20); + if (*buf) { + *verseBuf++ = *buf; + if (*verseNum == -1) { + if (isdigit(*buf)) { + sscanf(buf, "%d", verseNum); + } + } + } + if (read(fp, &buf[20], 1) != 1) { + retVal = 1; + for (int i = 1; i < 12; i++) + *verseBuf++ = buf[i]; + break; + } + } + *--verseBuf = 0; + paridx = 3; + // trim trailing junk + do { + verseBuf--; + if (paridx > -1) { + if (*verseBuf == parchar[paridx]) { + *verseBuf = 0; + paridx--; + continue; + } + if (paridx < 3) { + for (;paridx < 4;paridx++) + *verseBuf++ = parchar[paridx]; + break; + } + } + if ((*verseBuf != ' ') && (*verseBuf != 10) && (*verseBuf != 13) && (*verseBuf != '\\')) + break; + *verseBuf = 0; + } while (verseBuf > finalBuf); + *++verseBuf = 0; + + // check for Paragraph marker on next verse + for (int i = 7; i < 48; i++) { + if (buf[i] == '¶') { + *verseBuf++ = '<'; + *verseBuf++ = 'C'; + *verseBuf++ = 'M'; + *verseBuf++ = '>'; + *verseBuf++ = 0; + break; + } + } + + filterVerse(finalBuf, (testament == 2)?'G':'H'); + + return retVal; +} + + + + + + + +// lang - 'G' | 'H' +void TForm2::filterVerse(char *text, char lang) +{ + char *to, *from, token[MAXVLEN], tokpos = 0; + bool intoken = false; + bool intoken2 = false; + bool deref = false; + bool lastspace = false; + int len; + int maxlen = MAXVLEN - 1; + + + len = strlen(text) + 1; // shift string to right of buffer + if (len < maxlen) { + memmove(&text[maxlen - len], text, len); + from = &text[maxlen - len]; + } + else from = text; // ------------------------------- + + while (*from) { + if ((*from != ' ') && (!isdigit(*from)) && (*from != 10) && (*from !=13)) + break; + from++; + } + + for (to = text; *from; from++) { + if ((*from == '\\') && (!deref)) { + deref = true; + continue; + } + if (*from == '<') { + if (!isdigit(from[1])) { // Not a strongs number + if ((from[1] != 'C') || (from[2] != 'M') || (from[3] != '>')) { + *to++ = '<'; + *to++ = 'F'; + *to++ = 'O'; + *to++ = '>'; + continue; + } + } + } + if (*from == '>') { + if (!isdigit(from[-1])) { // Not a strongs number + if ((from[-2] != 'C') || (from[-1] != 'M') || (from[-3] != '<')) { + *to++ = '<'; + *to++ = 'F'; + *to++ = 'o'; + *to++ = '>'; + continue; + } + } + } + if (deref) { + deref = false; + if (*from == '{') { + *to++ = '<'; + *to++ = 'R'; + *to++ = 'F'; + *to++ = '>'; + continue; + } + + if (*from == '}') { + *to++ = '<'; + *to++ = 'R'; + *to++ = 'f'; + *to++ = '>'; + if (from[1] == '\\' && from[2] == 'i' && from[3] == '0') { + from += 3; + if (from[1] == ' ') { + if (lastspace) + from++; + } + } + continue; + } + if (*from == 'i') { + if (from[1] == '1') { + if (from[2] == ' ' && from[3] == '\\' && from[4] == '{') { + from++; + if (lastspace) + from++; + continue; + } + *to++ = '<'; + *to++ = 'F'; + *to++ = 'I'; + *to++ = '>'; + from++; + if (from[1] == ' ') { + if (lastspace) + from++; + } + continue; + } + if (from[1] == '0') { + *to++ = '<'; + *to++ = 'F'; + *to++ = 'i'; + *to++ = '>'; + from++; + if (from[1] == ' ') { + if (lastspace) + from++; + } + if ((from[1] == ' ') && (from[2] == ' ')){ // dorky, but OLB places 2 spaces after italics off + from++; + } + continue; + } + } + if (*from == 'f' && from[1] == 's') { + from++; + while (isdigit(from[1])) { + from++; + } + if (from[1] == ' ') { + if (lastspace) + from++; + } + continue; + } + *to++ = '\\'; + *to++ = *from; + lastspace = (*from == ' '); + continue; + } + + if (*from == '<') { + if (isdigit(from[1])) { + intoken = true; + tokpos = 0; + memset(token, 0, 20); + continue; + } + } + if (*from == '(') { + if (isdigit(from[1])) { + intoken2 = true; + tokpos = 0; + memset(token, 0, 20); + continue; + } + } + if ((*from == '>') && (intoken)) { + intoken = false; + if (*(to - 1) == ' ') + to--; + *to++ = '<'; + *to++ = 'W'; + *to++ = lang; + for (int i = 0; i < strlen(token); i++) + *to++ = token[i]; + *to++ = '>'; + continue; + } + if ((*from == ')') && (intoken2)) { + intoken2 = false; + if (*(to - 1) == ' ') + to--; + *to++ = '<'; + *to++ = 'W'; + *to++ = 'T'; + *to++ = lang; + for (int i = 0; i < strlen(token); i++) + *to++ = token[i]; + *to++ = '>'; + continue; + } + + if ((*from == 13) || (*from == 10)) { + continue; + } + + if (*from == '¶') { + if (from[1] == ' ') { + from++; + } + continue; + } + + if (intoken || intoken2) + token[tokpos++] = *from; + else + *to++ = *from; + lastspace = (*from == ' '); + } + *to-- = 0; + *++to = '\n'; + *++to = 0; +} + + +void TForm2::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); + MessageBox(this->Handle, buf, "ProcessFile", MB_OK); + return; + } + + sprintf(buf, "%s.vss", fileName); + unlink(buf); + if ((vfp = open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE)) == -1) { + sprintf(buf, "Couldn't open file: %s\n", buf); + MessageBox(this->Handle, buf, "ProcessFile", MB_OK); + return; + } + + sprintf(buf, "%s.cps", fileName); + unlink(buf); + if ((cfp = open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE)) == -1) { + sprintf(buf, "Couldn't open file: %s\n", buf); + MessageBox(this->Handle, buf, "ProcessFile", MB_OK); + return; + } + + sprintf(buf, "%s.bks", fileName); + unlink(buf); + if ((bfp = open(buf, O_CREAT|O_WRONLY|O_BINARY, S_IREAD|S_IWRITE)) == -1) { + sprintf(buf, "Couldn't open file: %s\n", buf); + MessageBox(this->Handle, buf, "ProcessFile", MB_OK); + 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); + + +} + +void __fastcall TForm2::Button1Click(TObject *Sender) +{ + ProcessFile(FilePathEdit->Text.c_str()); +} +//--------------------------------------------------------------------------- + + -- cgit