diff options
Diffstat (limited to 'utilities/imp2ld.cpp')
-rw-r--r-- | utilities/imp2ld.cpp | 193 |
1 files changed, 131 insertions, 62 deletions
diff --git a/utilities/imp2ld.cpp b/utilities/imp2ld.cpp index ec2fcf6..7d8b604 100644 --- a/utilities/imp2ld.cpp +++ b/utilities/imp2ld.cpp @@ -1,19 +1,24 @@ -/* -* Copyright 2009 CrossWire Bible Society (http://www.crosswire.org) -* CrossWire Bible Society -* P. O. Box 2528 -* Tempe, AZ 85280-2528 -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of the GNU General Public License as published by the -* Free Software Foundation version 2. -* -* This program is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* General Public License for more details. -* -*/ +/****************************************************************************** + * + * imp2ld.cpp - Utility to import LD modules in IMP format + * + * $Id: imp2ld.cpp 2833 2013-06-29 06:40:28Z chrislit $ + * + * Copyright 2002-2013 CrossWire Bible Society (http://www.crosswire.org) + * CrossWire Bible Society + * P. O. Box 2528 + * Tempe, AZ 85280-2528 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + */ #ifdef _MSC_VER #pragma warning( disable: 4251 ) @@ -27,6 +32,7 @@ #include <rawld4.h> #include <zld.h> #include <zipcomprs.h> +#include <lzsscomprs.h> #include <stdio.h> using std::string; @@ -35,78 +41,141 @@ using std::string; using namespace sword; #endif +void usage(const char *progName, const char *error = 0) { + if (error) fprintf(stderr, "\n%s: %s\n", progName, error); + fprintf(stderr, "\n=== imp2ld (Revision $Rev: 2234 $) SWORD lexicon importer.\n"); + fprintf(stderr, "\nusage: %s <imp_file> [options]\n", progName); + fprintf(stderr, " -a\t\t\t augment module if exists (default is to create new)\n"); + fprintf(stderr, " -z\t\t\t use ZIP compression (default no compression)\n"); + fprintf(stderr, " -Z\t\t\t use LZSS compression (default no compression)\n"); + fprintf(stderr, " -o <output_path>\t where to write data files.\n"); + fprintf(stderr, " -4\t\t\t use 4 byte size entries (default is 2).\n"); + fprintf(stderr, " -b <entry_count>\t\t compression block size (default 30 entries)\n"); + fprintf(stderr, " -s\t\t\t case sensitive keys (default is not case sensitive)\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "'imp' format is a simple standard for importing data into SWORD modules.\n" + "Required is a plain text file containing $$$key lines followed by content.\n\n" + "$$$Abraham\n" + "Abraham was the father of Isaac...\n" + "He was called by God to leave his country and journey to the land of Canaan...\n" + "$$$Isaac\n" + "Isaac was the son of Abraham and Sarah...\n\n"); + exit(-1); +} 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] [entries per compression block]\n"; - + std::vector<string> linkbuffer; signed long i = 0; string keybuffer; string entbuffer; string linebuffer; - char modname[16]; char links = 0; + string modname; + SWBuf outPath = ""; + bool append = false; long blockCount = 30; - std::vector<string> linkbuffer; + bool caseSensitive = false; + SWCompress *compressor = 0; + SWBuf compType = ""; + bool fourByteSize = false; - 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); - } + if (argc < 2) usage(*argv); - std::ifstream infile(argv[1]); + const char *progName = argv[0]; + const char *inFileName = argv[1]; - char mode = 1; - if (argc > 3) { - switch (*argv[3]) { - case 'z': mode = 3; break; - case '2': mode = 2; break; - default: mode = 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 (argc > 4) { - long bcTemp = atoi(argv[4]); - if (bcTemp > 0) { - blockCount = bcTemp; + + + 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; - switch (mode) { - case 3: + if (compType == "ZIP") { #ifndef EXCLUDEZLIB - zLD::createModule(modname); - mod = new zLD(modname, 0, 0, blockCount, new ZipCompress()); + compressor = new ZipCompress(); #else - fprintf(stderr, "ERROR: %s: SWORD library not compiled with ZIP compression support.\n\tBe sure libzip is available when compiling SWORD library", *argv); - exit(-2); + usage(*argv, "ERROR: SWORD library not compiled with ZIP compression support.\n\tBe sure libzip is available when compiling SWORD library"); #endif - break; - case 2: - RawLD::createModule(modname); - mod = new RawLD(modname); - break; - case 1: - RawLD4::createModule(modname); - mod = new RawLD4(modname); - break; } + 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->Persist(1); + key = mod->createKey(); + linkKey = mod->createKey(); + key->setPersist(true); mod->setKey(key); while (!infile.eof()) { |