[sword-svn] r2105 - in trunk: . include scripts src/mgr src/modules/comments src/modules/comments/rawcom4 src/modules/common src/modules/texts src/modules/texts/rawtext4 utilities

scribe at www.crosswire.org scribe at www.crosswire.org
Thu Oct 11 13:59:15 MST 2007


Author: scribe
Date: 2007-10-11 13:59:14 -0700 (Thu, 11 Oct 2007)
New Revision: 2105

Added:
   trunk/include/rawcom4.h
   trunk/include/rawtext4.h
   trunk/include/rawverse4.h
   trunk/src/modules/comments/rawcom4/
   trunk/src/modules/comments/rawcom4/Makefile.am
   trunk/src/modules/comments/rawcom4/rawcom4.cpp
   trunk/src/modules/common/rawverse4.cpp
   trunk/src/modules/texts/rawtext4/
   trunk/src/modules/texts/rawtext4/Makefile.am
   trunk/src/modules/texts/rawtext4/rawtext4.cpp
Modified:
   trunk/ChangeLog
   trunk/include/config.h
   trunk/scripts/mkswordtar
   trunk/src/mgr/swmgr.cpp
   trunk/src/modules/comments/Makefile.am
   trunk/src/modules/common/Makefile.am
   trunk/src/modules/texts/Makefile.am
   trunk/utilities/imp2vs.cpp
Log:
	Added new RawText4 and RawCom4 drivers which allow
		for a 4 byte record size.  Patch submitted by
		Doug Rintoul <doug_rintoul at sil dot org>



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2007-10-08 20:36:23 UTC (rev 2104)
+++ trunk/ChangeLog	2007-10-11 20:59:14 UTC (rev 2105)
@@ -1,5 +1,10 @@
 API ChangeLog 
 
+11-Oct-2007	Troy A. Griffitts <scribe at crosswire.org>
+	Added new RawText4 and RawCom4 drivers which allow
+		for a 4 byte record size.  Patch submitted by
+		Doug Rintoul <doug_rintoul at sil dot org>
+
 6-Oct-2007	Troy A. Griffitts <scribe at crosswire.org>
 	Added SWBuf::stripPrefix method which works nice
 		for returning and stripping stuff like

Modified: trunk/include/config.h
===================================================================
--- trunk/include/config.h	2007-10-08 20:36:23 UTC (rev 2104)
+++ trunk/include/config.h	2007-10-11 20:59:14 UTC (rev 2105)
@@ -1,4 +1,4 @@
-/* include/config.h.  Generated by configure.  */
+/* include/config.h.  Generated from config.h.in by configure.  */
 /* include/config.h.in.  Generated from configure.ac by autoheader.  */
 
 /* Define to 1 if you have the <dlfcn.h> header file. */

Added: trunk/include/rawcom4.h
===================================================================
--- trunk/include/rawcom4.h	                        (rev 0)
+++ trunk/include/rawcom4.h	2007-10-11 20:59:14 UTC (rev 2105)
@@ -0,0 +1,63 @@
+/******************************************************************************
+ *  rawcom.h   - code for class 'RawCom4'- a module that reads raw commentary
+ *			files:	ot and nt using indexs ??.bks ??.cps ??.vss
+ *
+ * $Id: rawcom.h 1864 2005-11-20 06:06:40Z scribe $
+ *
+ * Copyright 1998 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.
+ *
+ */
+
+#ifndef RAWCOM4_H
+#define RAWCOM4_H
+
+#include <rawverse4.h>
+#include <swcom.h>
+
+#include <defs.h>
+
+SWORD_NAMESPACE_START
+
+class SWDLLEXPORT RawCom4 : public RawVerse4, public SWCom {
+
+
+public:
+    
+	RawCom4(const char *ipath, const char *iname = 0, const char *idesc = 0,
+			SWDisplay * idisp = 0, SWTextEncoding encoding = ENC_UNKNOWN,
+			SWTextDirection dir = DIRECTION_LTR, SWTextMarkup markup = FMT_UNKNOWN,
+			const char* ilang = 0);
+	virtual ~RawCom4();
+
+	virtual SWBuf &getRawEntryBuf();
+
+	virtual void increment(int steps);
+	virtual void decrement(int steps) { increment(-steps); }
+
+	// write interface ----------------------------
+	virtual bool isWritable();
+	static char createModule(const char *path) { return RawVerse4::createModule(path); }
+	virtual void setEntry(const char *inbuf, long len = -1);	// Modify current module entry
+	virtual void linkEntry(const SWKey *linkKey);	// Link current module entry to other module entry
+	virtual void deleteEntry();	// Delete current module entry
+	// end write interface ------------------------
+
+	SWMODULE_OPERATORS
+
+};
+
+SWORD_NAMESPACE_END
+
+#endif

Added: trunk/include/rawtext4.h
===================================================================
--- trunk/include/rawtext4.h	                        (rev 0)
+++ trunk/include/rawtext4.h	2007-10-11 20:59:14 UTC (rev 2105)
@@ -0,0 +1,67 @@
+/******************************************************************************
+ *  rawtext.h   - code for class 'RawText4'- a module that reads raw text files:
+ *		  ot and nt using indexs ??.bks ??.cps ??.vss
+ *
+ * $Id: rawtext.h 1864 2005-11-20 06:06:40Z scribe $
+ *
+ * Copyright 1998 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.
+ *
+ */
+
+#ifndef RAWTEXT4_H
+#define RAWTEXT4_H
+
+#include <rawverse4.h>
+#include <rawstr4.h>
+#include <swtext.h>
+
+#include <defs.h>
+
+SWORD_NAMESPACE_START
+
+class RawStr;
+
+class SWDLLEXPORT RawText4 : public SWText, public RawVerse4 {
+
+	RawStr4 *fastSearch[2];
+
+public:
+  
+	RawText4(const char *ipath, const char *iname = 0, const char *idesc = 0, SWDisplay * idisp = 0, SWTextEncoding encoding = ENC_UNKNOWN, SWTextDirection dir = DIRECTION_LTR, SWTextMarkup markup = FMT_UNKNOWN,
+	const char* ilang = 0);
+	virtual ~RawText4();
+	virtual SWBuf &getRawEntryBuf();
+	virtual void increment(int steps = 1);
+	virtual void decrement(int steps = 1) { increment(-steps); }
+	virtual signed char createSearchFramework(
+			void (*percent) (char, void *) = &nullPercent,
+			void *percentUserData = 0);
+	virtual void deleteSearchFramework();
+	virtual bool hasSearchFramework() { return true; }
+	virtual ListKey &search(const char *istr, int searchType = 0, int flags = 0, SWKey * scope = 0, bool * justCheckIfSupported = 0, void (*percent)(char, void *) = &SWModule::nullPercent, void *percentUserData = 0);
+	// write interface ----------------------------
+	virtual bool isWritable();
+	static char createModule(const char *path) { return RawVerse4::createModule(path); }
+	virtual void setEntry(const char *inbuf, long len = -1);	// Modify current module entry
+	virtual void linkEntry(const SWKey *linkKey);	// Link current module entry to other module entry
+	virtual void deleteEntry();	// Delete current module entry
+	// end write interface ------------------------
+
+	SWMODULE_OPERATORS
+
+};
+
+SWORD_NAMESPACE_END
+#endif

Added: trunk/include/rawverse4.h
===================================================================
--- trunk/include/rawverse4.h	                        (rev 0)
+++ trunk/include/rawverse4.h	2007-10-11 20:59:14 UTC (rev 2105)
@@ -0,0 +1,42 @@
+/******************************************************************************
+ *  rawverse.h   - code for class 'RawVerse'- a module that reads raw text
+ *			files:  ot and nt using indexs ??.bks ??.cps ??.vss
+ *			and provides lookup and parsing functions based on
+ *			class VerseKey
+ */
+
+#ifndef RAWVERSE4_H
+#define RAWVERSE4_H
+
+
+#include <defs.h>
+
+SWORD_NAMESPACE_START
+
+class FileDesc;
+class SWBuf;
+
+class SWDLLEXPORT RawVerse4 {
+
+
+	static int instance;		// number of instantiated RawVerse objects or derivitives
+protected:
+	FileDesc *idxfp[2];
+	FileDesc *textfp[2];
+
+	char *path;
+	void prepText(SWBuf &buf);
+	void doSetText(char testmt, long idxoff, const char *buf, long len = -1);
+	void doLinkEntry(char testmt, long destidxoff, long srcidxoff);
+
+public:
+	static const char *nl;
+	RawVerse4(const char *ipath, int fileMode = -1);
+	virtual ~RawVerse4();
+	void findOffset(char testmt, long idxoff, long *start,	unsigned long *end);
+	void readText(char testmt, long start, unsigned long size, SWBuf &buf);
+	static char createModule(const char *path);
+};
+
+SWORD_NAMESPACE_END
+#endif

Modified: trunk/scripts/mkswordtar
===================================================================
--- trunk/scripts/mkswordtar	2007-10-08 20:36:23 UTC (rev 2104)
+++ trunk/scripts/mkswordtar	2007-10-11 20:59:14 UTC (rev 2105)
@@ -5,9 +5,6 @@
 
 if test `echo $REV` == `echo $SWORDVER`; then 
 	chmod +x *
-	chmod +x ../apps/X11/cheatah/configure
-	chmod +x ../apps/X11/cheatah/missing
-	#cp sapphire.cpp ../src/modules/common
 	cd ..; ./autogen.sh
 	cd ..; tar -v -c -p -s -z --exclude sword-$REV/bin -X sword-$REV/distignore -f sword-$REV.tar.gz sword-$REV/*
 else

Modified: trunk/src/mgr/swmgr.cpp
===================================================================
--- trunk/src/mgr/swmgr.cpp	2007-10-08 20:36:23 UTC (rev 2104)
+++ trunk/src/mgr/swmgr.cpp	2007-10-11 20:59:14 UTC (rev 2105)
@@ -32,9 +32,11 @@
 
 #include <swmgr.h>
 #include <rawtext.h>
+#include <rawtext4.h>
 #include <filemgr.h>
 #include <rawgenbook.h>
 #include <rawcom.h>
+#include <rawcom4.h>
 #include <hrefcom.h>
 #include <rawld.h>
 #include <rawld4.h>
@@ -803,6 +805,10 @@
 		newmod = new RawText(datapath.c_str(), name, description.c_str(), 0, enc, direction, markup, lang.c_str());
 	}
 
+	if (!stricmp(driver, "RawText4")) {
+		newmod = new RawText4(datapath.c_str(), name, description.c_str(), 0, enc, direction, markup, lang.c_str());
+	}
+
 	// backward support old drivers
 	if (!stricmp(driver, "RawGBF")) {
 		newmod = new RawText(datapath.c_str(), name, description.c_str(), 0, enc, direction, markup, lang.c_str());
@@ -812,6 +818,10 @@
 		newmod = new RawCom(datapath.c_str(), name, description.c_str(), 0, enc, direction, markup, lang.c_str());
 	}
 
+	if (!stricmp(driver, "RawCom4")) {
+		newmod = new RawCom4(datapath.c_str(), name, description.c_str(), 0, enc, direction, markup, lang.c_str());
+	}
+
 	if (!stricmp(driver, "RawFiles")) {
 		newmod = new RawFiles(datapath.c_str(), name, description.c_str(), 0, enc, direction, markup, lang.c_str());
 	}

Modified: trunk/src/modules/comments/Makefile.am
===================================================================
--- trunk/src/modules/comments/Makefile.am	2007-10-08 20:36:23 UTC (rev 2104)
+++ trunk/src/modules/comments/Makefile.am	2007-10-11 20:59:14 UTC (rev 2105)
@@ -3,6 +3,7 @@
 libsword_la_SOURCES += $(commentsdir)/swcom.cpp
 
 include ../src/modules/comments/rawcom/Makefile.am
+include ../src/modules/comments/rawcom4/Makefile.am
 include ../src/modules/comments/rawfiles/Makefile.am
 include ../src/modules/comments/zcom/Makefile.am
 include ../src/modules/comments/hrefcom/Makefile.am

Added: trunk/src/modules/comments/rawcom4/Makefile.am
===================================================================
--- trunk/src/modules/comments/rawcom4/Makefile.am	                        (rev 0)
+++ trunk/src/modules/comments/rawcom4/Makefile.am	2007-10-11 20:59:14 UTC (rev 2105)
@@ -0,0 +1,2 @@
+rawcom4dir = $(top_srcdir)/src/modules/comments/rawcom4
+libsword_la_SOURCES += $(rawcom4dir)/rawcom4.cpp

Added: trunk/src/modules/comments/rawcom4/rawcom4.cpp
===================================================================
--- trunk/src/modules/comments/rawcom4/rawcom4.cpp	                        (rev 0)
+++ trunk/src/modules/comments/rawcom4/rawcom4.cpp	2007-10-11 20:59:14 UTC (rev 2105)
@@ -0,0 +1,153 @@
+/******************************************************************************
+ *  rawcom4.cpp - code for class 'RawCom4'- a module that reads raw commentary
+ *			files:	ot and nt using indexs ??.bks ??.cps ??.vss
+ */
+
+
+#include <ctype.h>
+#include <stdio.h>
+#include <fcntl.h>
+
+#include <filemgr.h>
+#include <rawverse4.h>
+#include <rawcom4.h>
+#include <versekey.h>
+
+SWORD_NAMESPACE_START
+
+ /******************************************************************************
+ * RawCom4 Constructor - Initializes data for instance of RawCom4
+ *
+ * ENT:	iname - Internal name for module
+ *	idesc - Name to display to user for module
+ *	idisp	 - Display object to use for displaying
+ */
+
+RawCom4::RawCom4(const char *ipath, const char *iname, const char *idesc, SWDisplay *idisp, SWTextEncoding encoding, SWTextDirection dir, SWTextMarkup markup, const char* ilang)
+		: RawVerse4(ipath),
+            SWCom(iname, idesc, idisp, encoding, dir, markup, ilang){
+}
+
+
+/******************************************************************************
+ * RawCom4 Destructor - Cleans up instance of RawCom4
+ */
+
+RawCom4::~RawCom4()
+{
+}
+
+
+bool RawCom4::isWritable() {
+	return ((idxfp[0]->getFd() > 0) && ((idxfp[0]->mode & FileMgr::RDWR) == FileMgr::RDWR));
+}
+/******************************************************************************
+ * RawCom4::getRawEntry()	- Returns the correct verse when char * cast
+ *					is requested
+ *
+ * RET: string buffer with verse
+ */
+
+SWBuf &RawCom4::getRawEntryBuf() {
+	long  start = 0;
+	unsigned long size = 0;
+	VerseKey *key = &getVerseKey();
+
+	findOffset(key->Testament(), key->Index(), &start, &size);
+	entrySize = size;        // support getEntrySize call
+
+	entryBuf = "";
+	readText(key->Testament(), start, size, entryBuf);
+
+	rawFilter(entryBuf, 0);	// hack, decipher
+	rawFilter(entryBuf, key);
+
+//	if (!isUnicode())
+		prepText(entryBuf);
+
+	return entryBuf;
+}
+
+
+/******************************************************************************
+ * RawCom4::increment	- Increments module key a number of entries
+ *
+ * ENT:	steps	- Number of entries to jump forward
+ *
+ * RET: *this
+ */
+
+void RawCom4::increment(int steps) {
+	long  start;
+	unsigned long size;
+	VerseKey *tmpkey = &getVerseKey();
+
+	findOffset(tmpkey->Testament(), tmpkey->Index(), &start, &size);
+
+	SWKey lastgood = *tmpkey;
+	while (steps) {
+		long laststart = start;
+		unsigned long lastsize = size;
+		SWKey lasttry = *tmpkey;
+		(steps > 0) ? (*key)++ : (*key)--;
+		tmpkey = &getVerseKey();
+
+		if ((error = key->Error())) {
+			*key = lastgood;
+			break;
+		}
+		long index = tmpkey->Index();
+		findOffset(tmpkey->Testament(), index, &start, &size);
+		if (
+			(((laststart != start) || (lastsize != size))	// we're a different entry
+//				&& (start > 0)
+				&& (size))	// and we actually have a size
+				||(!skipConsecutiveLinks)) {	// or we don't want to skip consecutive links
+			steps += (steps < 0) ? 1 : -1;
+			lastgood = *tmpkey;
+		}
+	}
+	error = (error) ? KEYERR_OUTOFBOUNDS : 0;
+}
+
+
+void RawCom4::setEntry(const char *inbuf, long len) {
+	VerseKey *key = &getVerseKey();
+	doSetText(key->Testament(), key->Index(), inbuf, len);
+}
+
+
+void RawCom4::linkEntry(const SWKey *inkey) {
+	VerseKey *destkey = &getVerseKey();
+	const VerseKey *srckey = 0;
+
+	// see if we have a VerseKey * or decendant
+	SWTRY {
+		srckey = SWDYNAMIC_CAST(VerseKey, inkey);
+	}
+	SWCATCH ( ... ) {}
+	// if we don't have a VerseKey * decendant, create our own
+	if (!srckey)
+		srckey = new VerseKey(inkey);
+
+	doLinkEntry(destkey->Testament(), destkey->Index(), srckey->Index());
+
+	if (inkey != srckey) // free our key if we created a VerseKey
+		delete srckey;
+}
+
+
+/******************************************************************************
+ * RawCom4::deleteEntry	- deletes this entry
+ *
+ * RET: *this
+ */
+
+void RawCom4::deleteEntry() {
+
+	VerseKey *key = &getVerseKey();
+	doSetText(key->Testament(), key->Index(), "");
+}
+
+
+SWORD_NAMESPACE_END

Modified: trunk/src/modules/common/Makefile.am
===================================================================
--- trunk/src/modules/common/Makefile.am	2007-10-08 20:36:23 UTC (rev 2104)
+++ trunk/src/modules/common/Makefile.am	2007-10-11 20:59:14 UTC (rev 2105)
@@ -12,6 +12,7 @@
 endif
 libsword_la_SOURCES += $(SWZLIB)
 libsword_la_SOURCES += $(commondir)/rawverse.cpp
+libsword_la_SOURCES += $(commondir)/rawverse4.cpp
 libsword_la_SOURCES += $(commondir)/swcipher.cpp
 libsword_la_SOURCES += $(commondir)/zverse.cpp
 libsword_la_SOURCES += $(commondir)/zstr.cpp

Added: trunk/src/modules/common/rawverse4.cpp
===================================================================
--- trunk/src/modules/common/rawverse4.cpp	                        (rev 0)
+++ trunk/src/modules/common/rawverse4.cpp	2007-10-11 20:59:14 UTC (rev 2105)
@@ -0,0 +1,350 @@
+/******************************************************************************
+ *  rawverse.cpp   - code for class 'RawVerse4'- a module that reads raw text
+ *			files:  ot and nt using indexs ??.bks ??.cps ??.vss
+ *			and provides lookup and parsing functions based on
+ *			class VerseKey
+ */
+
+
+#include <ctype.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include <utilstr.h>
+#include <rawverse4.h>
+#include <versekey.h>
+#include <sysdata.h>
+#include <filemgr.h>
+#include <swbuf.h>
+
+
+SWORD_NAMESPACE_START
+
+/******************************************************************************
+ * RawVerse4 Statics
+ */
+
+int RawVerse4::instance = 0;
+const char *RawVerse4::nl = "\r\n";
+
+
+/******************************************************************************
+ * RawVerse4 Constructor - Initializes data for instance of RawVerse4
+ *
+ * ENT:	ipath - path of the directory where data and index files are located.
+ *		be sure to include the trailing separator (e.g. '/' or '\')
+ *		(e.g. 'modules/texts/rawtext/webster/')
+ */
+
+RawVerse4::RawVerse4(const char *ipath, int fileMode)
+{
+	SWBuf buf;
+
+	path = 0;
+	stdstr(&path, ipath);
+	
+	if ((path[strlen(path)-1] == '/') || (path[strlen(path)-1] == '\\'))
+		path[strlen(path)-1] = 0;
+
+	if (fileMode == -1) { // try read/write if possible
+		fileMode = FileMgr::RDWR;
+	}
+		
+	buf.setFormatted("%s/ot.vss", path);
+	idxfp[0] = FileMgr::getSystemFileMgr()->open(buf, fileMode, true);
+
+	buf.setFormatted("%s/nt.vss", path);
+	idxfp[1] = FileMgr::getSystemFileMgr()->open(buf, fileMode, true);
+
+	buf.setFormatted("%s/ot", path);
+	textfp[0] = FileMgr::getSystemFileMgr()->open(buf, fileMode, true);
+
+	buf.setFormatted("%s/nt", path);
+	textfp[1] = FileMgr::getSystemFileMgr()->open(buf, fileMode, true);
+
+	instance++;
+}
+
+
+/******************************************************************************
+ * RawVerse4 Destructor - Cleans up instance of RawVerse4
+ */
+
+RawVerse4::~RawVerse4()
+{
+	int loop1;
+
+	if (path)
+		delete [] path;
+
+	--instance;
+
+	for (loop1 = 0; loop1 < 2; loop1++) {
+		FileMgr::getSystemFileMgr()->close(idxfp[loop1]);
+		FileMgr::getSystemFileMgr()->close(textfp[loop1]);
+	}
+}
+
+
+/******************************************************************************
+ * RawVerse4::findoffset	- Finds the offset of the key verse from the indexes
+ *
+ * ENT: testmt	- testament to find (0 - Bible/module introduction)
+ *	idxoff	- offset into .vss
+ *	start	- address to store the starting offset
+ *	size	- address to store the size of the entry
+ */
+
+void RawVerse4::findOffset(char testmt, long idxoff, long *start, unsigned long *size) {
+	idxoff *= 8;
+	if (!testmt)
+		testmt = ((idxfp[1]) ? 1:2);
+		
+	if (idxfp[testmt-1]->getFd() >= 0) {
+		idxfp[testmt-1]->seek(idxoff, SEEK_SET);
+		idxfp[testmt-1]->read(start, 4);
+		long len = idxfp[testmt-1]->read(size, 4); 		// read size
+
+		*start = swordtoarch32(*start);
+		*size  = swordtoarch32(*size);
+
+		if (len < 2) {
+			*size = (unsigned long)((*start) ? (textfp[testmt-1]->seek(0, SEEK_END) - (long)*start) : 0);	// if for some reason we get an error reading size, make size to end of file
+		}
+	}
+	else {
+		*start = 0;
+		*size = 0;
+	}
+}
+
+
+/******************************************************************************
+ * RawVerse4::preptext	- Prepares the text before returning it to external
+ *				objects
+ *
+ * ENT:	buf	- buffer where text is stored and where to store the prep'd
+ *			text.
+ */
+
+void RawVerse4::prepText(SWBuf &buf) {
+	unsigned int to, from; 
+	char space = 0, cr = 0, realdata = 0, nlcnt = 0;
+	char *rawBuf = buf.getRawData();
+	for (to = from = 0; rawBuf[from]; from++) {
+		switch (rawBuf[from]) {
+		case 10:
+			if (!realdata)
+				continue;
+			space = (cr) ? 0 : 1;
+			cr = 0;
+			nlcnt++;
+			if (nlcnt > 1) {
+//				*to++ = nl;
+				rawBuf[to++] = 10;
+//				*to++ = nl[1];
+//				nlcnt = 0;
+			}
+			continue;
+		case 13:
+			if (!realdata)
+				continue;
+//			*to++ = nl[0];
+			rawBuf[to++] = 10;
+			space = 0;
+			cr = 1;
+			continue;
+		}
+		realdata = 1;
+		nlcnt = 0;
+		if (space) {
+			space = 0;
+			if (rawBuf[from] != ' ') {
+				rawBuf[to++] = ' ';
+				from--;
+				continue;
+			}
+		}
+		rawBuf[to++] = rawBuf[from];
+	}
+	buf.setSize(to);
+
+	while (to > 1) {			// remove trailing excess
+		to--;
+		if ((rawBuf[to] == 10) || (rawBuf[to] == ' '))
+			buf.setSize(to);
+		else break;
+	}
+}
+
+
+/******************************************************************************
+ * RawVerse4::readtext	- gets text at a given offset
+ *
+ * ENT:	testmt	- testament file to search in (0 - Old; 1 - New)
+ *	start	- starting offset where the text is located in the file
+ *	size	- size of text entry + 2 (null)(null)
+ *	buf	- buffer to store text
+ *
+ */
+
+void RawVerse4::readText(char testmt, long start, unsigned long size, SWBuf &buf) {
+	buf = "";
+	buf.setFillByte(0);
+	buf.setSize(size + 1);
+	if (!testmt)
+		testmt = ((idxfp[1]) ? 1:2);
+	if (size) {
+		if (textfp[testmt-1]->getFd() >= 0) {
+			textfp[testmt-1]->seek(start, SEEK_SET);
+			textfp[testmt-1]->read(buf.getRawData(), (int)size); 
+		}
+	}
+}
+
+
+/******************************************************************************
+ * RawVerse4::settext	- Sets text for current offset
+ *
+ * ENT: testmt	- testament to find (0 - Bible/module introduction)
+ *	idxoff	- offset into .vss
+ *	buf	- buffer to store
+ *      len     - length of buffer (0 - null terminated)
+ */
+
+void RawVerse4::doSetText(char testmt, long idxoff, const char *buf, long len)
+{
+	long start, outstart;
+	unsigned long size;
+	unsigned long outsize;
+
+	idxoff *= 8;
+	if (!testmt)
+		testmt = ((idxfp[1]) ? 1:2);
+
+	size = outsize = (len < 0) ? strlen(buf) : len;
+
+	start = outstart = textfp[testmt-1]->seek(0, SEEK_END);
+	idxfp[testmt-1]->seek(idxoff, SEEK_SET);
+
+	if (size) {
+		textfp[testmt-1]->seek(start, SEEK_SET);
+		textfp[testmt-1]->write(buf, (int)size);
+
+		// add a new line to make data file easier to read in an editor
+		textfp[testmt-1]->write(nl, 2);
+	}
+	else {
+		start = 0;
+	}
+
+	outstart = archtosword32(start);
+	outsize  = archtosword32(size);
+
+	idxfp[testmt-1]->write(&outstart, 4);
+	idxfp[testmt-1]->write(&outsize, 4);
+
+
+}
+
+
+/******************************************************************************
+ * RawVerse4::linkentry	- links one entry to another
+ *
+ * ENT: testmt	- testament to find (0 - Bible/module introduction)
+ *	destidxoff	- dest offset into .vss
+ *	srcidxoff		- source offset into .vss
+ */
+
+void RawVerse4::doLinkEntry(char testmt, long destidxoff, long srcidxoff) {
+	long start;
+	unsigned long size;
+
+	destidxoff *= 8;
+	srcidxoff  *= 8;
+
+	if (!testmt)
+		testmt = ((idxfp[1]) ? 1:2);
+
+	// get source
+	idxfp[testmt-1]->seek(srcidxoff, SEEK_SET);
+	idxfp[testmt-1]->read(&start, 4);
+	idxfp[testmt-1]->read(&size, 4);
+
+	// write dest
+	idxfp[testmt-1]->seek(destidxoff, SEEK_SET);
+	idxfp[testmt-1]->write(&start, 4);
+	idxfp[testmt-1]->write(&size, 4);
+}
+
+
+/******************************************************************************
+ * RawVerse4::CreateModule	- Creates new module files
+ *
+ * ENT: path	- directory to store module files
+ * RET: error status
+ */
+
+char RawVerse4::createModule(const char *ipath)
+{
+	char *path = 0;
+	char *buf = new char [ strlen (ipath) + 20 ];
+	FileDesc *fd, *fd2;
+
+	stdstr(&path, ipath);
+
+	if ((path[strlen(path)-1] == '/') || (path[strlen(path)-1] == '\\'))
+		path[strlen(path)-1] = 0;
+
+	sprintf(buf, "%s/ot", path);
+	FileMgr::removeFile(buf);
+	fd = FileMgr::getSystemFileMgr()->open(buf, FileMgr::CREAT|FileMgr::WRONLY, FileMgr::IREAD|FileMgr::IWRITE);
+	fd->getFd();
+	FileMgr::getSystemFileMgr()->close(fd);
+
+	sprintf(buf, "%s/nt", path);
+	FileMgr::removeFile(buf);
+	fd = FileMgr::getSystemFileMgr()->open(buf, FileMgr::CREAT|FileMgr::WRONLY, FileMgr::IREAD|FileMgr::IWRITE);
+	fd->getFd();
+	FileMgr::getSystemFileMgr()->close(fd);
+
+	sprintf(buf, "%s/ot.vss", path);
+	FileMgr::removeFile(buf);
+	fd = FileMgr::getSystemFileMgr()->open(buf, FileMgr::CREAT|FileMgr::WRONLY, FileMgr::IREAD|FileMgr::IWRITE);
+	fd->getFd();
+
+	sprintf(buf, "%s/nt.vss", path);
+	FileMgr::removeFile(buf);
+	fd2 = FileMgr::getSystemFileMgr()->open(buf, FileMgr::CREAT|FileMgr::WRONLY, FileMgr::IREAD|FileMgr::IWRITE);
+	fd2->getFd();
+
+	VerseKey vk;
+	vk.Headings(1);
+	long offset = 0;
+	long size = 0;
+	for (vk = TOP; !vk.Error(); vk++) {
+		if (vk.Testament() == 1) {
+			fd->write(&offset, 4);
+			fd->write(&size, 4);
+		}
+		else	{
+			fd2->write(&offset, 4);
+			fd2->write(&size, 4);
+		}
+	}
+
+	FileMgr::getSystemFileMgr()->close(fd);
+	FileMgr::getSystemFileMgr()->close(fd2);
+
+	delete [] path;
+	delete [] buf;
+/*
+	RawVerse4 rv(path);
+	VerseKey mykey("Rev 22:21");
+*/
+	
+	return 0;
+}
+
+SWORD_NAMESPACE_END

Modified: trunk/src/modules/texts/Makefile.am
===================================================================
--- trunk/src/modules/texts/Makefile.am	2007-10-08 20:36:23 UTC (rev 2104)
+++ trunk/src/modules/texts/Makefile.am	2007-10-11 20:59:14 UTC (rev 2105)
@@ -3,4 +3,5 @@
 libsword_la_SOURCES += $(textsdir)/swtext.cpp
 
 include ../src/modules/texts/rawtext/Makefile.am
+include ../src/modules/texts/rawtext4/Makefile.am
 include ../src/modules/texts/ztext/Makefile.am

Added: trunk/src/modules/texts/rawtext4/Makefile.am
===================================================================
--- trunk/src/modules/texts/rawtext4/Makefile.am	                        (rev 0)
+++ trunk/src/modules/texts/rawtext4/Makefile.am	2007-10-11 20:59:14 UTC (rev 2105)
@@ -0,0 +1,2 @@
+rawtext4dir = $(top_srcdir)/src/modules/texts/rawtext4
+libsword_la_SOURCES += $(rawtext4dir)/rawtext4.cpp

Added: trunk/src/modules/texts/rawtext4/rawtext4.cpp
===================================================================
--- trunk/src/modules/texts/rawtext4/rawtext4.cpp	                        (rev 0)
+++ trunk/src/modules/texts/rawtext4/rawtext4.cpp	2007-10-11 20:59:14 UTC (rev 2105)
@@ -0,0 +1,548 @@
+/******************************************************************************
+ *  rawtext4.cpp - code for class 'RawText4'- a module that reads raw text files:
+ *		  ot and nt using indexs ??.bks ??.cps ??.vss
+ */
+
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <sysdata.h>
+
+#include <utilstr.h>
+#include <rawverse4.h>
+#include <rawtext4.h>
+#include <rawstr4.h>
+#include <filemgr.h>
+#include <versekey.h>
+#include <stringmgr.h>
+
+#include <regex.h>	// GNU
+#include <map>
+#include <list>
+#include <algorithm>
+
+#ifndef USELUCENE
+using std::map;
+using std::list;
+using std::find;
+#endif
+
+SWORD_NAMESPACE_START
+
+#ifndef USELUCENE
+typedef  map < SWBuf, list<long> > strlist;
+typedef list<long> longlist;
+#endif
+
+/******************************************************************************
+ * RawText4 Constructor - Initializes data for instance of RawText4
+ *
+ * ENT:	iname - Internal name for module
+ *	idesc - Name to display to user for module
+ *	idisp	 - Display object to use for displaying
+ */
+
+RawText4::RawText4(const char *ipath, const char *iname, const char *idesc, SWDisplay *idisp, SWTextEncoding enc, SWTextDirection dir, SWTextMarkup mark, const char* ilang)
+		: SWText(iname, idesc, idisp, enc, dir, mark, ilang),
+		RawVerse4(ipath) {
+		
+#ifndef USELUCENE
+	SWBuf fname;
+	fname = path;
+	char ch = fname.c_str()[strlen(fname.c_str())-1];
+	if ((ch != '/') && (ch != '\\'))
+		fname += "/";
+	
+	for (int loop = 0; loop < 2; loop++) {
+		fastSearch[loop] = 0;
+		SWBuf fastidxname =(fname + ((loop)?"ntwords.dat":"otwords.dat"));
+		if (FileMgr::existsFile(fastidxname.c_str())) {
+			fastidxname = (fname + ((loop)?"ntwords.idx":"otwords.idx"));
+			if (FileMgr::existsFile(fastidxname.c_str()))
+				fastSearch[loop] = new RawStr4((fname + ((loop)?"ntwords":"otwords")).c_str());
+		}
+	}
+#endif
+}
+
+
+/******************************************************************************
+ * RawText4 Destructor - Cleans up instance of RawText4
+ */
+
+RawText4::~RawText4() {
+#ifndef USELUCENE
+	if (fastSearch[0])
+		delete fastSearch[0];
+
+	if (fastSearch[1])
+		delete fastSearch[1];
+#endif
+}
+
+
+bool RawText4::isWritable() {
+	return ((idxfp[0]->getFd() > 0) && ((idxfp[0]->mode & FileMgr::RDWR) == FileMgr::RDWR));
+}
+
+
+/******************************************************************************
+ * RawText4::getRawEntry	- Returns the correct verse when char * cast
+ *					is requested
+ *
+ * RET: string buffer with verse
+ */
+
+SWBuf &RawText4::getRawEntryBuf() {
+	long  start = 0;
+	unsigned long size = 0;
+	VerseKey &key = getVerseKey();
+
+	findOffset(key.Testament(), key.Index(), &start, &size);
+	entrySize = size;        // support getEntrySize call
+
+	entryBuf = "";
+	readText(key.Testament(), start, size, entryBuf);
+
+	rawFilter(entryBuf, 0);	// hack, decipher
+	rawFilter(entryBuf, &key);
+
+//	if (!isUnicode())
+		prepText(entryBuf);
+
+	return entryBuf;
+}
+
+
+signed char RawText4::createSearchFramework(void (*percent)(char, void *), void *percentUserData) {
+#ifndef USELUCENE
+	SWKey *savekey = 0;
+	SWKey *searchkey = 0;
+	SWKey textkey;
+	char *word = 0;
+	char *wordBuf = 0;
+
+	// dictionary holds words associated with a list
+	// containing every module position that contains
+	// the word.  [0] Old Testament; [1] NT
+	map < SWBuf, list<long> > dictionary[2];
+
+
+	// save key information so as not to disrupt original
+	// module position
+	if (!key->Persist()) {
+		savekey = CreateKey();
+		*savekey = *key;
+	}
+	else	savekey = key;
+
+	searchkey = (key->Persist())?key->clone():0;
+	if (searchkey) {
+		searchkey->Persist(1);
+		setKey(*searchkey);
+	}
+
+	// position module at the beginning
+	*this = TOP;
+
+	VerseKey *lkey = (VerseKey *)key;
+
+	// iterate thru each entry in module
+	while (!Error()) {
+		long index = lkey->Index();
+		wordBuf = (char *)calloc(sizeof(char), strlen(StripText()) + 1);
+		strcpy(wordBuf, StripText());
+
+		// grab each word from the text
+		word = strtok(wordBuf, " !.,?;:()-=+/\\|{}[]\"<>");
+		while (word) {
+
+			// make word upper case
+			toupperstr(word);
+
+			// lookup word in dictionary (or make entry in dictionary
+			// for this word) and add this module position (index) to
+			// the word's associated list of module positions
+			dictionary[lkey->Testament()-1][word].push_back(index);
+			word = strtok(NULL, " !.,?;:()-=+/\\|{}[]\"<>");
+		}
+		free(wordBuf);
+		(*this)++;
+	}
+
+	// reposition module back to where it was before we were called
+	setKey(*savekey);
+
+	if (!savekey->Persist())
+		delete savekey;
+
+	if (searchkey)
+		delete searchkey;
+
+	
+	// --------- Let's output an index from our dictionary -----------
+	FileDesc *datfd;
+	FileDesc *idxfd;
+	strlist::iterator it;
+	longlist::iterator it2;
+	unsigned long offset, entryoff;
+	unsigned long size;
+
+	SWBuf fname;
+	fname = path;
+	char ch = fname.c_str()[strlen(fname.c_str())-1];
+	if ((ch != '/') && (ch != '\\'))
+		fname += "/";
+
+	// for old and new testament do...
+	for (int loop = 0; loop < 2; loop++) {
+		datfd = FileMgr::getSystemFileMgr()->open((fname + ((loop)?"ntwords.dat":"otwords.dat")).c_str(), FileMgr::CREAT|FileMgr::WRONLY, 00644);
+		if (datfd->getFd() == -1)
+			return -1;
+		idxfd = FileMgr::getSystemFileMgr()->open((fname + ((loop)?"ntwords.idx":"otwords.idx")).c_str(), FileMgr::CREAT|FileMgr::WRONLY, 00644);
+		if (idxfd->getFd() == -1) {
+			FileMgr::getSystemFileMgr()->close(datfd);
+			return -1;
+		}
+
+		// iterate thru each word in the dictionary
+		for (it = dictionary[loop].begin(); it != dictionary[loop].end(); it++) {
+			printf("%s: ", it->first.c_str());
+
+			// get our current offset in our word.dat file and write this as the start
+			// of the next entry in our database
+			offset = datfd->seek(0, SEEK_CUR);
+			idxfd->write(&offset, 4);
+
+			// write our word out to the word.dat file, delineating with a \n
+			datfd->write(it->first.c_str(), strlen(it->first.c_str()));
+			datfd->write("\n", 1);
+
+			// force our mod position list for this word to be unique (remove
+			// duplicates that may exist if the word was found more than once
+			// in the verse
+			it->second.unique();
+
+			// iterate thru each mod position for this word and output it to
+			// our database
+			unsigned short count = 0;
+			for (it2 = it->second.begin(); it2 != it->second.end(); it2++) {
+				entryoff= *it2;
+				datfd->write(&entryoff, 4);
+				count++;
+			}
+			
+			// now see what our new position is in our word.dat file and
+			// determine the size of this database entry
+			size = datfd->seek(0, SEEK_CUR) - offset;
+
+			// store the size of this database entry
+			idxfd->write(&size, 4);
+			printf("%d entries (size: %d)\n", count, size);
+		}
+		FileMgr::getSystemFileMgr()->close(datfd);
+		FileMgr::getSystemFileMgr()->close(idxfd);
+	}
+	return 0;
+#else
+	return SWModule::createSearchFramework(percent, percentUserData);
+#endif
+}
+
+
+void RawText4::deleteSearchFramework() {
+#ifndef USELUCENE
+	SWBuf target = path;
+	char ch = target.c_str()[strlen(target.c_str())-1];
+	if ((ch != '/') && (ch != '\\'))
+		target += "/lucene";
+	FileMgr::removeFile(target + "ntwords.dat");
+	FileMgr::removeFile(target + "otwords.dat");
+	FileMgr::removeFile(target + "ntwords.idx");
+	FileMgr::removeFile(target + "otwords.idx");
+#else
+	SWModule::deleteSearchFramework();
+#endif
+}
+
+
+/******************************************************************************
+ * SWModule::search 	- Searches a module for a string
+ *
+ * ENT:	istr		- string for which to search
+ * 	searchType	- type of search to perform
+ *				>=0 - regex
+ *				-1  - phrase
+ *				-2  - multiword
+ * 	flags		- options flags for search
+ *	justCheckIfSupported	- if set, don't search, only tell if this
+ *							function supports requested search.
+ *
+ * RET: ListKey set to verses that contain istr
+ */
+
+ListKey &RawText4::search(const char *istr, int searchType, int flags, SWKey *scope, bool *justCheckIfSupported, void (*percent)(char, void *), void *percentUserData) {
+#ifndef USELUCENE
+	listKey.ClearList();
+
+	if ((fastSearch[0]) && (fastSearch[1])) {
+
+		switch (searchType) {
+		case -2: {
+
+			if ((flags & REG_ICASE) != REG_ICASE)	// if haven't chosen to
+											// ignore case
+				break; // can't handle fast case sensitive searches
+
+			// test to see if our scope for this search is bounded by a
+			// VerseKey
+			VerseKey *testKeyType = 0;
+			SWTRY {
+				testKeyType = SWDYNAMIC_CAST(VerseKey, ((scope)?scope:key));
+			}
+			SWCATCH ( ... ) {}
+			// if we don't have a VerseKey * decendant we can't handle
+			// because of scope.
+			// In the future, add bool SWKey::isValid(const char *tryString);
+			if (!testKeyType)
+				break;
+
+
+			// check if we just want to see if search is supported.
+			// If we've gotten this far, then it is supported.
+			if (justCheckIfSupported) {
+				*justCheckIfSupported = true;
+				return listKey;
+			}
+
+			SWKey saveKey = *testKeyType; // save current place
+
+			char error = 0;
+			char **words = 0;
+			char *wordBuf = 0;
+			int wordCount = 0;
+			long start;
+			unsigned long size;
+			char *idxbuf = 0;
+			SWBuf datBuf;
+			list <long> indexes;
+			list <long> indexes2;
+			VerseKey vk;
+			vk = TOP;
+
+			(*percent)(10, percentUserData);
+
+			// toupper our copy of search string
+			stdstr(&wordBuf, istr);
+			toupperstr(wordBuf);
+
+			// get list of individual words
+			words = (char **)calloc(sizeof(char *), 10);
+			int allocWords = 10;
+			words[wordCount] = strtok(wordBuf, " ");
+			while (words[wordCount]) {
+				wordCount++;
+				if (wordCount == allocWords) {
+					allocWords+=10;
+					words = (char **)realloc(words, sizeof(char *)*allocWords);
+				}
+				words[wordCount] = strtok(NULL, " ");
+			}
+
+			(*percent)(20, percentUserData);
+
+			// clear our result set
+			indexes.erase(indexes.begin(), indexes.end());
+
+			// search both old and new testament indexes
+			for (int j = 0; j < 2; j++) {
+				// iterate thru each word the user passed to us.
+				for (int i = 0; i < wordCount; i++) {
+
+					// clear this word's result set
+					indexes2.erase(indexes2.begin(), indexes2.end());
+					error = 0;
+
+					// iterate thru every word in the database that starts
+					// with our search word
+					for (int away = 0; !error; away++) {
+						idxbuf = 0;
+						
+						// find our word in the database and jump ahead _away_
+						error = fastSearch[j]->findOffset(words[i], &start, &size, away);
+
+						// get the word from the database
+						fastSearch[j]->getIDXBufDat(start, &idxbuf);
+
+						// check to see if it starts with our target word
+						if (strlen(idxbuf) > strlen(words[i]))
+							idxbuf[strlen(words[i])] = 0;
+//						else	words[i][strlen(idxbuf)] = 0;
+						if (!strcmp(idxbuf, words[i])) {
+
+							// get data for this word from database
+							delete [] idxbuf;
+							idxbuf = 0;
+							datBuf = "";
+							fastSearch[j]->readText(start, &size, &idxbuf, datBuf);
+
+							// we know that the data consists of sizof(long)
+							// records each a valid module position that constains
+							// this word
+							//
+							// iterate thru each of these module positions
+							long *keyindex = (long *)datBuf.getRawData();
+							while (keyindex < (long *)(datBuf.getRawData() + size - (strlen(idxbuf) + 1))) {
+								if (i) {	// if we're not on our first word
+
+									// check to see if this word is already in the result set.
+									// This is our AND functionality
+									if (find(indexes.begin(), indexes.end(), *keyindex) != indexes.end())
+										// add to new result set
+										indexes2.push_back(*keyindex);
+								}
+								else	indexes2.push_back(*keyindex);
+								keyindex++;
+							}
+						}
+						else error = 1;	// no more matches
+						free(idxbuf);
+					}
+
+					// make new result set final result set
+					indexes = indexes2;
+
+					percent((char)(20 + (float)((j*wordCount)+i)/(wordCount * 2) * 78), percentUserData);
+				}
+
+				// indexes contains our good verses, lets return them in a listKey
+				indexes.sort();
+
+				// iterate thru each good module position that meets the search
+				for (longlist::iterator it = indexes.begin(); it != indexes.end(); it++) {
+
+					// set a temporary verse key to this module position
+					vk.Testament(j+1);
+					vk.Error();
+					vk.Index(*it);
+
+					// check scope
+					// Try to set our scope key to this verse key
+					if (scope) {
+						*testKeyType = vk;
+
+						// check to see if it set ok and if so, add to our return list
+						if (*testKeyType == vk)
+							listKey << (const char *) vk;
+					}
+					else listKey << (const char*) vk;
+				}
+			}
+			(*percent)(98, percentUserData);
+
+			free(words);
+			free(wordBuf);
+
+			*testKeyType = saveKey;	// set current place back to original
+
+			listKey = TOP;
+			(*percent)(100, percentUserData);
+			return listKey;
+		}
+
+		default:
+			break;
+		}
+	}
+
+	// check if we just want to see if search is supported
+	if (justCheckIfSupported) {
+		*justCheckIfSupported = false;
+		return listKey;
+	}
+
+#endif
+	// if we don't support this search, fall back to base class
+	return SWModule::search(istr, searchType, flags, scope, justCheckIfSupported, percent, percentUserData);
+}
+
+
+void RawText4::setEntry(const char *inbuf, long len) {
+	VerseKey &key = getVerseKey();
+	doSetText(key.Testament(), key.Index(), inbuf, len);
+}
+
+
+void RawText4::linkEntry(const SWKey *inkey) {
+	VerseKey &destkey = getVerseKey();
+	const VerseKey *srckey = 0;
+
+	// see if we have a VerseKey * or decendant
+	SWTRY {
+		srckey = SWDYNAMIC_CAST(VerseKey, inkey);
+	}
+	SWCATCH ( ... ) {}
+	// if we don't have a VerseKey * decendant, create our own
+	if (!srckey)
+		srckey = new VerseKey(inkey);
+
+	doLinkEntry(destkey.Testament(), destkey.Index(), srckey->Index());
+
+	if (inkey != srckey) // free our key if we created a VerseKey
+		delete srckey;
+}
+
+
+/******************************************************************************
+ * RawText4::deleteEntry	- deletes this entry
+ *
+ * RET: *this
+ */
+
+void RawText4::deleteEntry() {
+	VerseKey &key = getVerseKey();
+	doSetText(key.Testament(), key.Index(), "");
+}
+
+/******************************************************************************
+ * RawText4::increment	- Increments module key a number of entries
+ *
+ * ENT:	increment	- Number of entries to jump forward
+ *
+ * RET: *this
+ */
+
+void RawText4::increment(int steps) {
+	long  start;
+	unsigned long size;
+	VerseKey *tmpkey = &getVerseKey();
+
+	findOffset(tmpkey->Testament(), tmpkey->Index(), &start, &size);
+
+	SWKey lastgood = *tmpkey;
+	while (steps) {
+		long laststart = start;
+		unsigned long lastsize = size;
+		SWKey lasttry = *tmpkey;
+		(steps > 0) ? (*key)++ : (*key)--;
+		tmpkey = &getVerseKey();
+
+		if ((error = key->Error())) {
+			*key = lastgood;
+			break;
+		}
+		long index = tmpkey->Index();
+		findOffset(tmpkey->Testament(), index, &start, &size);
+		if (
+			(((laststart != start) || (lastsize != size))	// we're a different entry
+//				&& (start > 0)
+				&& (size))	// and we actually have a size
+				||(!skipConsecutiveLinks)) {	// or we don't want to skip consecutive links
+			steps += (steps < 0) ? 1 : -1;
+			lastgood = *tmpkey;
+		}
+	}
+	error = (error) ? KEYERR_OUTOFBOUNDS : 0;
+}
+
+SWORD_NAMESPACE_END

Modified: trunk/utilities/imp2vs.cpp
===================================================================
--- trunk/utilities/imp2vs.cpp	2007-10-08 20:36:23 UTC (rev 2104)
+++ trunk/utilities/imp2vs.cpp	2007-10-11 20:59:14 UTC (rev 2105)
@@ -9,11 +9,13 @@
 
 #include <iostream>
 #include <rawtext.h>
+ #include <rawtext4.h>
 #include <versekey.h>
 
 
 #ifndef NO_SWORD_NAMESPACE
 using sword::RawText;
+using sword::RawText4;
 using sword::VerseKey;
 using sword::SWText;
 using sword::ListKey;
@@ -38,15 +40,37 @@
     fprintf(stderr, helptext.c_str(), argv[0]);
     exit(-1);
   }
+  int mode = 1;
+  if (argc > 3) {
+    switch (*argv[3]) {
+    case '4':
+      mode = 2;
+      break;
+    default:
+      mode = 1;
+    }
+  }
   
+
+
   try {
   
   ifstream infile(argv[1]);
 
   SWText* mod;
-  RawText::createModule(modname.c_str());
-  RawText modRaw(modname.c_str());
-  mod = &modRaw;
+  RawText * modRaw;
+  RawText4 * modRaw4;
+  
+  if (mode == 1) {
+	std::cout << "Mode 1\n";
+          RawText::createModule(modname.c_str());
+          modRaw= new RawText(modname.c_str());
+          mod = modRaw;
+  } else {
+          RawText4::createModule(modname.c_str());
+          modRaw4= new RawText4(modname.c_str());
+          mod = modRaw4;
+  }
 
   VerseKey* vkey = new VerseKey;
   vkey->Headings(1);




More information about the sword-cvs mailing list