diff options
Diffstat (limited to 'Build/source/libs/teckit/TECkit-src/source/Sample-tools/TxtConv.cpp')
-rw-r--r-- | Build/source/libs/teckit/TECkit-src/source/Sample-tools/TxtConv.cpp | 52 |
1 files changed, 28 insertions, 24 deletions
diff --git a/Build/source/libs/teckit/TECkit-src/source/Sample-tools/TxtConv.cpp b/Build/source/libs/teckit/TECkit-src/source/Sample-tools/TxtConv.cpp index 65a6761f769..9e0ae121459 100644 --- a/Build/source/libs/teckit/TECkit-src/source/Sample-tools/TxtConv.cpp +++ b/Build/source/libs/teckit/TECkit-src/source/Sample-tools/TxtConv.cpp @@ -1,6 +1,6 @@ /* TxtConv.c - Copyright (c) 2002-2014 SIL International. + Copyright (c) 2002-2016 SIL International. 2008-01-23 jk revised endian-ness stuff to allow Universal build 5-May-2005 jk added include <stdlib.h> and <string.h> to keep gcc happy @@ -53,7 +53,7 @@ doConversion(TECkit_Converter cnv, FILE* inFile, FILE* outFile, UInt32 opts) char outBuffer[kOutBufLen]; UInt32 savedLen = 0; UInt32 offset = 0; - TECkit_Status status; + TECkit_Status status = kStatus_NeedMoreInput; inBase = ftell(inFile); fseek(inFile, 0, SEEK_END); @@ -61,19 +61,21 @@ doConversion(TECkit_Converter cnv, FILE* inFile, FILE* outFile, UInt32 opts) fseek(inFile, inBase, SEEK_SET); while (1) { - UInt32 inUsed, outUsed, lookahead; + UInt32 inUsed = 0, outUsed = 0, lookahead = 0; UInt32 amountToRead = kInBufLen - savedLen; char* inPtr = inBuffer; - UInt32 inAvail; + UInt32 inAvail = savedLen; if (offset + amountToRead > inLength) amountToRead = inLength - offset; - inAvail = savedLen + amountToRead; - if (inAvail > 0) { - fread(inBuffer + savedLen, 1, amountToRead, inFile); + if (amountToRead > 0) { + amountToRead = fread(inBuffer + savedLen, 1, amountToRead, inFile); offset += amountToRead; + inAvail += amountToRead; + } + if (inAvail > 0) { status = TECkit_ConvertBufferOpt(cnv, (Byte*)inPtr, inAvail, &inUsed, (Byte*)outBuffer, kOutBufLen, &outUsed, opts, &lookahead); fwrite(outBuffer, 1, outUsed, outFile); @@ -107,6 +109,7 @@ doConversion(TECkit_Converter cnv, FILE* inFile, FILE* outFile, UInt32 opts) fwrite(outBuffer, 1, outUsed, outFile); savedLen -= inUsed; inPtr += inUsed; + inUsed = 0; } while ((status & kStatusMask_Basic) == kStatus_OutputBufferFull); if ((status & kStatusMask_Basic) == kStatus_UnmappedChar) @@ -344,7 +347,7 @@ Usage: %s -i inFile -o outFile [-t tecFile] [-r] [-if inForm] [-of outForm] [-no return 1; } - fread(table, 1, len, tecFile); + len = fread(table, 1, len, tecFile); fclose(tecFile); status = forward @@ -370,6 +373,7 @@ Usage: %s -i inFile -o outFile [-t tecFile] [-r] [-if inForm] [-of outForm] [-no // if the input is supposed to be Unicode, and the inForm is unspecified, try to guess it // or skip over the BOM if one is found that matches the specified inForm unsigned char sig[4]; + size_t sigLen; if (inForm == kForm_Bytes) { fprintf(stderr, "improper input encoding form for this mapping"); return 1; @@ -377,24 +381,24 @@ Usage: %s -i inFile -o outFile [-t tecFile] [-r] [-if inForm] [-of outForm] [-no switch (inForm) { case kForm_Unspecified: - fread(sig, 1, 4, inFile); - if (sig[0] == 0xef && sig[1] == 0xbb && sig[2] == 0xbf) { + sigLen = fread(sig, 1, 4, inFile); + if (sigLen >= 3 && sig[0] == 0xef && sig[1] == 0xbb && sig[2] == 0xbf) { inForm = kForm_UTF8; fseek(inFile, 3, SEEK_SET); } - else if (sig[0] == 0xfe && sig[1] == 0xff) { + else if (sigLen >= 2 && sig[0] == 0xfe && sig[1] == 0xff) { inForm = kForm_UTF16BE; fseek(inFile, 2, SEEK_SET); } - else if (sig[0] == 0xff && sig[1] == 0xfe && sig[2] == 0x00 && sig[3] == 0x00) { + else if (sigLen >= 4 && sig[0] == 0xff && sig[1] == 0xfe && sig[2] == 0x00 && sig[3] == 0x00) { inForm = kForm_UTF32LE; /* fseek(inFile, 4, SEEK_SET); */ } - else if (sig[0] == 0xff && sig[1] == 0xfe) { + else if (sigLen >= 2 && sig[0] == 0xff && sig[1] == 0xfe) { inForm = kForm_UTF16LE; fseek(inFile, 2, SEEK_SET); } - else if (sig[0] == 0x00 && sig[1] == 0x00 && sig[2] == 0xfe && sig[3] == 0xff) { + else if (sigLen >= 4 && sig[0] == 0x00 && sig[1] == 0x00 && sig[2] == 0xfe && sig[3] == 0xff) { inForm = kForm_UTF32BE; /* fseek(inFile, 4, SEEK_SET); */ } @@ -405,32 +409,32 @@ Usage: %s -i inFile -o outFile [-t tecFile] [-r] [-if inForm] [-of outForm] [-no break; case kForm_UTF8: - fread(sig, 1, 3, inFile); - if (!(sig[0] == 0xef && sig[1] == 0xbb && sig[2] == 0xbf)) + sigLen = fread(sig, 1, 3, inFile); + if (sigLen >= 3 && !(sig[0] == 0xef && sig[1] == 0xbb && sig[2] == 0xbf)) fseek(inFile, 0, SEEK_SET); break; case kForm_UTF16BE: - fread(sig, 1, 2, inFile); - if (!(sig[0] == 0xfe && sig[1] == 0xff)) + sigLen = fread(sig, 1, 2, inFile); + if (sigLen >= 2 && !(sig[0] == 0xfe && sig[1] == 0xff)) fseek(inFile, 0, SEEK_SET); break; case kForm_UTF16LE: - fread(sig, 1, 2, inFile); - if (!(sig[0] == 0xff && sig[1] == 0xfe)) + sigLen = fread(sig, 1, 2, inFile); + if (sigLen >= 2 && !(sig[0] == 0xff && sig[1] == 0xfe)) fseek(inFile, 0, SEEK_SET); break; case kForm_UTF32BE: - fread(sig, 1, 4, inFile); - if (!(sig[0] == 0x00 && sig[1] == 0x00 && sig[2] == 0xfe && sig[3] == 0xff)) + sigLen = fread(sig, 1, 4, inFile); + if (sigLen >= 4 && !(sig[0] == 0x00 && sig[1] == 0x00 && sig[2] == 0xfe && sig[3] == 0xff)) fseek(inFile, 0, SEEK_SET); break; case kForm_UTF32LE: - fread(sig, 1, 4, inFile); - if (!(sig[0] == 0xff && sig[1] == 0xfe && sig[2] == 0x00 && sig[3] == 0x00)) + sigLen = fread(sig, 1, 4, inFile); + if (sigLen >= 4 && !(sig[0] == 0xff && sig[1] == 0xfe && sig[2] == 0x00 && sig[3] == 0x00)) fseek(inFile, 0, SEEK_SET); break; } |