From 03134fa5f6f25d92724ce4c183f9bbe12a9e37dc Mon Sep 17 00:00:00 2001 From: "Roberto C. Sanchez" Date: Sat, 29 Mar 2014 10:53:59 -0400 Subject: Imported Upstream version 1.5.11 --- utilities/addvs.cpp | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 utilities/addvs.cpp (limited to 'utilities/addvs.cpp') diff --git a/utilities/addvs.cpp b/utilities/addvs.cpp new file mode 100644 index 0000000..3d73344 --- /dev/null +++ b/utilities/addvs.cpp @@ -0,0 +1,186 @@ +#include +#include +#include +#include +#include + +#ifndef __GNUC__ +#include +#else +#include +#endif + +#include +#include +#include +#include + +#ifndef NO_SWORD_NAMESPACE +using sword::SWMgr; +using sword::RawText; +using sword::SWKey; +using sword::VerseKey; +using sword::ListKey; +using sword::SWModule; +#endif + +int main(int argc, char **argv) { + + const char * helptext = "addvs 1.1 Bible & Commentary module creation tool for the SWORD Project\nUse -a to add a new verse from standard input or a file, -d to delete a verse,\n-l to link two verses, -c to create a new module.\n usage:\n %s -a []\n %s -d \n %s -l \n %s -c \n"; + long entrysize; + + if (argc < 3) { + fprintf(stderr, helptext, argv[0], argv[0], argv[0], argv[0]); + exit(-1); + } + if (!strcmp(argv[1], "-a") && (argc == 4 || argc == 5)) { + + // Do some initialization stuff + char buffer[65536]; //this is the max size of any entry + RawText * mod = new RawText(argv[2]); // open our datapath with our RawText driver. + VerseKey *vkey = new VerseKey; + vkey->Headings(1); + vkey->AutoNormalize(0); + vkey->Persist(1); // the magical setting + *vkey = argv[3]; + // Set our VerseKey + mod->setKey(*vkey); + if (!vkey->Chapter()) { + // bad hack >> + // 0:0 is Book intro + // (chapter):0 is Chapter intro + // + // 0:2 is Module intro + // 0:1 is Testament intro + int backstep = vkey->Verse(); + vkey->Verse(0); + *mod -= backstep; + // << bad hack + + FILE *infile; + // case: add from text file + //Open our data file and read its contents into the buffer + if (argc == 5) infile = fopen(argv[4], "r"); + // case: add from stdin + else infile = stdin; + + entrysize = fread(buffer, sizeof(char), sizeof(buffer), infile); + + mod->setEntry(buffer, entrysize); // save text to module at current position + } + else { + ListKey listkey = vkey->ParseVerseList(argv[3], "Gen1:1", true); + int i; + bool havefirst = false; + VerseKey firstverse; + for (i = 0; i < listkey.Count(); i++) { + VerseKey *element = SWDYNAMIC_CAST(VerseKey, listkey.GetElement(i)); + if (element) { + mod->Key(element->LowerBound()); + VerseKey finalkey = element->UpperBound(); + std::cout << (const char*)mod->Key() << "-" << (const char*)finalkey << std::endl; + if (!havefirst) { + havefirst = true; + firstverse = mod->Key(); + FILE *infile; + // case: add from text file + //Open our data file and read its contents into the buffer + if (argc == 5) infile = fopen(argv[4], "r"); + // case: add from stdin + else infile = stdin; + + entrysize = fread(buffer, sizeof(char), sizeof(buffer), infile); + + mod->setEntry(buffer, entrysize); // save text to module at current position + std::cout << "f" << (const char*)firstverse << std::endl; + (*mod)++; + } + while (mod->Key() <= finalkey) { + std::cout << (const char*)mod->Key() << std::endl; + *(SWModule*)mod << &firstverse; + (*mod)++; + } + } + else { + if (havefirst) { + mod->Key(*listkey.GetElement(i)); + *(SWModule*)mod << &firstverse; + std::cout << (const char*)mod->Key() << std::endl; + } + else { + mod->Key(*listkey.GetElement(i)); + havefirst = true; + firstverse = mod->Key(); + FILE *infile; + // case: add from text file + //Open our data file and read its contents into the buffer + if (argc == 5) infile = fopen(argv[4], "r"); + // case: add from stdin + else infile = stdin; + + entrysize = fread(buffer, sizeof(char), sizeof(buffer), infile); + + mod->setEntry(buffer, entrysize); // save text to module at current position + std::cout << "f" << (const char*)firstverse << std::endl; + } + } + } + } + delete vkey; + } + // Link 2 verses + else if (!strcmp(argv[1], "-l") && argc == 5) { + // Do some initialization stuff + RawText *mod = new RawText(argv[2]); // open our datapath with our RawText driver. + + mod->setKey(argv[4]); // set key from argument + SWKey tmpkey = (SWKey) argv[3]; + *(SWModule*)mod << &(tmpkey); + delete mod; + } + + else if (!strcmp(argv[1], "-d") && argc == 4) { + RawText mod(argv[2]); // open our datapath with our RawText driver. + VerseKey *vkey = new VerseKey; + vkey->Headings(1); + vkey->AutoNormalize(0); + vkey->Persist(1); // the magical setting + + // Set our VerseKey + mod.setKey(*vkey); + *vkey = argv[3]; + + if (!vkey->Chapter()) + { + // bad hack >> + // 0:0 is Book intro + // (chapter):0 is Chapter intro + // + // 0:2 is Module intro + // 0:1 is Testament intro + int backstep = vkey->Verse(); + vkey->Verse(0); + mod -= backstep; + // << bad hack + } + + mod.deleteEntry(); + delete vkey; + } + + // Make a new module + else if (!strcmp(argv[1], "-c") && argc == 3) { + // Try to initialize a default set of datafiles and indicies at our + // datapath location passed to us from the user. + if (RawText::createModule(argv[2])) { + fprintf(stderr, "error: %s: couldn't create module at path: %s \n", argv[0], argv[2]); + exit(-2); + } + } + + // Bad arguments, print usage + else { + fprintf(stderr, helptext, argv[0], argv[0], argv[0], argv[0]); + exit(-1); + } +} -- cgit v1.2.3