void writeEntry(SWModule & module, std::string const & key, std::string const & entry, bool const replace) { if (key.size() && entry.size()) { std::cout << "from file: " << key << std::endl; VerseKey *vkey = (VerseKey *)module.getKey(); std::unique_ptr<VerseKey> linkMaster( static_cast<VerseKey *>(module.createKey().release())); ListKey listKey = vkey->parseVerseList(key.c_str(), "Gen1:1", true); bool first = true; for (listKey.positionToTop(); !listKey.popError(); listKey.increment()) { vkey->positionFrom(listKey); if (first) { *linkMaster = *vkey; std::string text; if (!replace) text = module.getRawEntry(); text += entry; std::cout << "adding entry: " << vkey->getText() << " length " << entry.size() << "/" << (unsigned short)text.size() << std::endl; module.setEntry(text.c_str()); first = false; } else { std::cout << "linking entry: " << vkey->getText() << " to " << linkMaster->getText() << std::endl; module.linkEntry(*linkMaster); } } } }
int main(int argc, char **argv) { const char * helptext ="imp2ld 1.0 Lexicon/Dictionary/Daily Devotional/Glossary module creation tool for the SWORD Project\n usage:\n %s <filename> [modname] [ 4 (default) | 2 | z - module driver]\n"; signed long i = 0; string keybuffer; string entbuffer; string linebuffer; char modname[16]; char links = 0; std::vector<string> linkbuffer; if (argc > 2) { strcpy (modname, argv[2]); } else if (argc > 1) { for (i = 0; (i < 16) && (argv[1][i]) && (argv[1][i] != '.'); i++) { modname[i] = argv[1][i]; } modname[i] = 0; } else { fprintf(stderr, helptext, argv[0]); exit(-1); } std::ifstream infile(argv[1]); char mode = 1; if (argc > 3) { switch (*argv[3]) { case 'z': mode = 3; break; case '2': mode = 2; break; default: mode = 1; } } SWModule *mod = 0; SWKey *key, *linkKey; switch (mode) { case 3: zLD::createModule(modname); mod = new zLD(modname, 0, 0, 30, new ZipCompress()); break; case 2: RawLD::createModule(modname); mod = new RawLD(modname); break; case 1: RawLD4::createModule(modname); mod = new RawLD4(modname); break; } key = mod->CreateKey(); linkKey = mod->CreateKey(); key->Persist(1); mod->setKey(key); while (!infile.eof()) { std::getline(infile, linebuffer); if (linebuffer.size() > 3 && linebuffer.substr(0,3) == "$$$") { if (keybuffer.size() && entbuffer.size()) { std::cout << keybuffer << std::endl; *key = keybuffer.c_str(); mod->setEntry(entbuffer.c_str(), entbuffer.size()); for (i = 0; i < links; i++) { std::cout << "Linking: " << linkbuffer[i] << std::endl; *linkKey = linkbuffer[i].c_str(); mod->linkEntry(linkKey); } } if (linebuffer.size() > 3) keybuffer = linebuffer.substr(3,linebuffer.size()); entbuffer.resize(0); linkbuffer.clear(); links = 0; } else if (linebuffer.size() > 3 && linebuffer.substr(0,3) == "%%%") { linkbuffer.push_back(linebuffer.substr(3,linebuffer.size())); links++; } else { entbuffer += linebuffer; } } //handle final entry if (keybuffer.size() && entbuffer.size()) { std::cout << keybuffer << std::endl; *key = keybuffer.c_str(); mod->setEntry(entbuffer.c_str(), entbuffer.size()); for (i = 0; i < links; i++) { std::cout << "Linking: " << linkbuffer[i] << std::endl; *linkKey = linkbuffer[i].c_str(); mod->linkEntry(linkKey); } } infile.close(); delete linkKey; delete key; delete mod; return 0; }
int main(int argc, char **argv) { std::vector<string> linkbuffer; signed long i = 0; string keybuffer; string entbuffer; string linebuffer; char links = 0; string modname; SWBuf outPath = ""; bool append = false; long blockCount = 30; bool caseSensitive = false; SWCompress *compressor = 0; SWBuf compType = ""; bool fourByteSize = false; if (argc < 2) usage(*argv); const char *progName = argv[0]; const char *inFileName = argv[1]; for (int i = 2; i < argc; i++) { if (!strcmp(argv[i], "-a")) { append = true; } else if (!strcmp(argv[i], "-z")) { if (compType.size()) usage(*argv, "Cannot specify both -z and -Z"); if (fourByteSize) usage(*argv, "Cannot specify both -z and -4"); compType = "ZIP"; } else if (!strcmp(argv[i], "-Z")) { if (compType.size()) usage(*argv, "Cannot specify both -z and -Z"); if (fourByteSize) usage(*argv, "Cannot specify both -Z and -4"); compType = "LZSS"; } else if (!strcmp(argv[i], "-4")) { fourByteSize = true; } else if (!strcmp(argv[i], "-b")) { if (i+1 < argc) { blockCount = atoi(argv[++i]); if (blockCount > 0) continue; } usage(*argv, "-b requires in entry count integer > 0"); } else if (!strcmp(argv[i], "-o")) { if (i+1 < argc) outPath = argv[++i]; else usage(progName, "-o requires <output_path>"); } else if (!strcmp(argv[i], "-s")) { caseSensitive = true; } else usage(progName, (((SWBuf)"Unknown argument: ")+ argv[i]).c_str()); } if (outPath.size() < 1) { for (i = 0; (i < 16) && (inFileName[i]) && (inFileName[i] != '.'); i++) { outPath += inFileName[i]; } } std::ifstream infile(inFileName); SWModule *mod = 0; SWKey *key, *linkKey; if (compType == "ZIP") { #ifndef EXCLUDEZLIB compressor = new ZipCompress(); #else usage(*argv, "ERROR: SWORD library not compiled with ZIP compression support.\n\tBe sure libzip is available when compiling SWORD library"); #endif } else if (compType == "LZSS") { compressor = new LZSSCompress(); } // setup module if (!append) { if (compressor) { if (zLD::createModule(outPath)) { fprintf(stderr, "ERROR: %s: couldn't create module at path: %s \n", *argv, outPath.c_str()); exit(-1); } } else { if (!fourByteSize) RawLD::createModule(outPath); else RawLD4::createModule(outPath); } } if (compressor) { // Create a compressed text module allowing very large entries // Taking defaults except for first, fourth, fifth and last argument mod = new zLD(outPath, 0, 0, blockCount, compressor, 0, ENC_UNKNOWN, DIRECTION_LTR, FMT_UNKNOWN, 0, caseSensitive); } else { mod = (!fourByteSize) ? (SWModule *)new RawLD (outPath, 0, 0, 0, ENC_UNKNOWN, DIRECTION_LTR, FMT_UNKNOWN, 0, caseSensitive) : (SWModule *)new RawLD4(outPath, 0, 0, 0, ENC_UNKNOWN, DIRECTION_LTR, FMT_UNKNOWN, 0, caseSensitive); } key = mod->createKey(); linkKey = mod->createKey(); key->setPersist(true); mod->setKey(key); while (!infile.eof()) { std::getline(infile, linebuffer); if (linebuffer.size() > 3 && linebuffer.substr(0,3) == "$$$") { if (keybuffer.size() && entbuffer.size()) { std::cout << keybuffer << std::endl; *key = keybuffer.c_str(); mod->setEntry(entbuffer.c_str(), entbuffer.size()); for (i = 0; i < links; i++) { std::cout << "Linking: " << linkbuffer[i] << std::endl; *linkKey = linkbuffer[i].c_str(); mod->linkEntry(linkKey); } } if (linebuffer.size() > 3) keybuffer = linebuffer.substr(3,linebuffer.size()); entbuffer.resize(0); linkbuffer.clear(); links = 0; } else if (linebuffer.size() > 3 && linebuffer.substr(0,3) == "%%%") { linkbuffer.push_back(linebuffer.substr(3,linebuffer.size())); links++; } else { entbuffer += linebuffer; } } //handle final entry if (keybuffer.size() && entbuffer.size()) { std::cout << keybuffer << std::endl; *key = keybuffer.c_str(); mod->setEntry(entbuffer.c_str(), entbuffer.size()); for (i = 0; i < links; i++) { std::cout << "Linking: " << linkbuffer[i] << std::endl; *linkKey = linkbuffer[i].c_str(); mod->linkEntry(linkKey); } } infile.close(); delete linkKey; delete key; delete mod; return 0; }