[sword-svn] r3125 - trunk/utilities

Chris Little chrislit at crosswire.org
Fri Mar 14 05:56:25 MST 2014


Yep. Fixed in r3129. I'm surprised this worked without causing any 
errors when there was no -e argument.
--Chris


On 03/14/2014 04:42 AM, DM Smith wrote:
> Shouldn't outputEncoder and outputDecoder be set to NULL outside of the argument processing?
>
> This code assumes that these have the default value of NULL. And only explicitly set it if it does argument processing.
>
> I don't know if it is true any more, but "back in the day" C/C++only zeroed out the first so many bytes of global variables. I was burned by this, in code "that I know I didn't touch" (I put the new global before an old one).
>
> Unless all compilers guarantee this I'd suggest setting them explicitly on declaration.
>
> BTW, I generally review all code that comes across my desk. ;)
>
> -- DM
>
> On Mar 14, 2014, at 7:31 AM, chrislit at crosswire.org wrote:
>
>> Author: chrislit
>> Date: 2014-03-14 04:31:58 -0700 (Fri, 14 Mar 2014)
>> New Revision: 3125
>>
>> Modified:
>>    trunk/utilities/osis2mod.cpp
>> Log:
>> This should address cases where the output encoding cannot simply be concatenated, and may slightly improve SCSU encoding compression
>>
>>
>> Modified: trunk/utilities/osis2mod.cpp
>> ===================================================================
>> --- trunk/utilities/osis2mod.cpp	2014-03-14 10:57:10 UTC (rev 3124)
>> +++ trunk/utilities/osis2mod.cpp	2014-03-14 11:31:58 UTC (rev 3125)
>> @@ -60,8 +60,10 @@
>> #include <utf8nfc.h>
>> #include <latin1utf8.h>
>> #include <utf8scsu.h>
>> +#include <scsuutf8.h>
>> #endif
>> #include <utf8utf16.h>
>> +#include <utf16utf8.h>
>>
>> #ifndef NO_SWORD_NAMESPACE
>> using namespace sword;
>> @@ -92,7 +94,8 @@
>> UTF8NFC    normalizer;
>> Latin1UTF8 converter;
>> #endif
>> -SWFilter*  outputConverter;
>> +SWFilter*  outputEncoder;
>> +SWFilter*  outputDecoder;
>>
>> int normalized = 0;
>> int converted  = 0;
>> @@ -539,20 +542,26 @@
>> 		}
>>
>> 		// If the desired output encoding is non-UTF-8, convert to that encoding
>> -		if (outputConverter) {
>> -			outputConverter->processText(activeVerseText, (SWKey *)2);  // note the hack of 2 to mimic a real key. TODO: remove all hacks
>> +		if (outputEncoder) {
>> +			outputEncoder->processText(activeVerseText, (SWKey *)2);  // note the hack of 2 to mimic a real key. TODO: remove all hacks
>> 		}
>>
>> 		// If the entry already exists, then append this entry to the text.
>> 		// This is for verses that are outside the chosen versification. They are appended to the prior verse.
>> 		// The space should not be needed if we retained verse tags.
>> -		// TODO: in the case of SCSU output, very slightly better compression might be
>> -		// achieved by decoding the currentText & activeVerseText, concatenating them,
>> -		// and re-encoding them as SCSU
>> 		SWBuf currentText = module->getRawEntry();
>> 		if (currentText.length()) {
>> 			cout << "INFO(WRITE): Appending entry: " << currentVerse.getOSISRef() << ": " << activeVerseText << endl;
>> +
>> +			// If we have a non-UTF-8 encoding, we should decode it before concatenating, then re-encode it
>> +			if (outputDecoder) {
>> +				outputDecoder->processText(activeVerseText, (SWKey *)2);
>> +				outputDecoder->processText(currentText, (SWKey *)2);
>> +			}
>> 			activeVerseText = currentText + " " + activeVerseText;
>> +			if (outputEncoder) {
>> +				outputDecoder->processText(activeVerseText, (SWKey *)2);
>> +			}
>> 		}
>>
>> 		if (debug & DEBUG_WRITE) {
>> @@ -1637,12 +1646,23 @@
>> 		else if (!strcmp(argv[i], "-e")) {
>> 			if (i+1 < argc) {
>> 				switch (argv[++i][0]) {
>> -				case '1': outputConverter = NULL; break; // leave as UTF-8
>> -				case '2': outputConverter = new UTF8UTF16(); break;
>> +				case '1': // leave as UTF-8
>> +					outputEncoder = NULL;
>> +					outputDecoder = NULL;
>> +					break;
>> +				case '2':
>> +					outputEncoder = new UTF8UTF16();
>> +					outputDecoder = new UTF16UTF8();
>> +					break;
>> #ifdef _ICU_
>> -				case 's': outputConverter = new UTF8SCSU(); break;
>> +				case 's':
>> +					outputEncoder = new UTF8SCSU();
>> +					outputDecoder = new SCSUUTF8();
>> +					break;
>> #endif
>> -				default: outputConverter = NULL;
>> +				default:
>> +					outputEncoder = NULL;
>> +					outputDecoder = NULL;
>> 				}
>> 			}
>> 		}
>> @@ -1830,8 +1850,10 @@
>> 	delete module;
>> 	if (cipherFilter)
>> 		delete cipherFilter;
>> -	if (outputConverter)
>> -		delete outputConverter;
>> +	if (outputEncoder)
>> +		delete outputEncoder;
>> +	if (outputDecoder)
>> +		delete outputDecoder;
>>
>> 	fprintf(stderr, "SUCCESS: %s: has finished its work and will now rest\n", program);
>> 	exit(0); // success
>>
>>
>> _______________________________________________
>> sword-cvs mailing list
>> sword-cvs at crosswire.org
>> http://www.crosswire.org/mailman/listinfo/sword-cvs
>




More information about the sword-cvs mailing list