summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-49.1/samples/layout/UnicodeReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu/icu-49.1/samples/layout/UnicodeReader.cpp')
-rw-r--r--Build/source/libs/icu/icu-49.1/samples/layout/UnicodeReader.cpp119
1 files changed, 119 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-49.1/samples/layout/UnicodeReader.cpp b/Build/source/libs/icu/icu-49.1/samples/layout/UnicodeReader.cpp
new file mode 100644
index 00000000000..ab5a7ef70b7
--- /dev/null
+++ b/Build/source/libs/icu/icu-49.1/samples/layout/UnicodeReader.cpp
@@ -0,0 +1,119 @@
+/*
+ ******************************************************************************
+ * Copyright (C) 1998-2005, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ ******************************************************************************
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "unicode/utypes.h"
+#include "unicode/unistr.h"
+
+#include "layout/LETypes.h"
+
+#include "GUISupport.h"
+#include "UnicodeReader.h"
+
+#define BYTE(b) (((int) b) & 0xFF)
+
+/*
+ * Read the text from a file. The text must start with a Unicode Byte
+ * Order Mark (BOM) so that we know what order to read the bytes in.
+ */
+const UChar *UnicodeReader::readFile(const char *fileName, GUISupport *guiSupport, int32_t &charCount)
+{
+ FILE *f;
+ int32_t fileSize;
+
+ UChar *charBuffer;
+ char *byteBuffer;
+ char startBytes[4] = {'\xA5', '\xA5', '\xA5', '\xA5'};
+ char errorMessage[128];
+ const char *cp = "";
+ int32_t signatureLength = 0;
+
+ f = fopen(fileName, "rb");
+
+ if( f == NULL ) {
+ sprintf(errorMessage,"Couldn't open %s: %s \n", fileName, strerror(errno));
+ guiSupport->postErrorMessage(errorMessage, "Text File Error");
+ return 0;
+ }
+
+ fseek(f, 0, SEEK_END);
+ fileSize = ftell(f);
+
+ fseek(f, 0, SEEK_SET);
+ fread(startBytes, sizeof(char), 4, f);
+
+ if (startBytes[0] == '\xFE' && startBytes[1] == '\xFF') {
+ cp = "UTF-16BE";
+ signatureLength = 2;
+ } else if (startBytes[0] == '\xFF' && startBytes[1] == '\xFE') {
+ if (startBytes[2] == '\x00' && startBytes[3] == '\x00') {
+ cp = "UTF-32LE";
+ signatureLength = 4;
+ } else {
+ cp = "UTF-16LE";
+ signatureLength = 2;
+ }
+ } else if (startBytes[0] == '\xEF' && startBytes[1] == '\xBB' && startBytes[2] == '\xBF') {
+ cp = "UTF-8";
+ signatureLength = 3;
+ } else if (startBytes[0] == '\x0E' && startBytes[1] == '\xFE' && startBytes[2] == '\xFF') {
+ cp = "SCSU";
+ signatureLength = 3;
+ } else if (startBytes[0] == '\x00' && startBytes[1] == '\x00' &&
+ startBytes[2] == '\xFE' && startBytes[3] == '\xFF') {
+ cp = "UTF-32BE";
+ signatureLength = 4;
+ } else {
+ sprintf(errorMessage, "Couldn't detect the encoding of %s: (%2.2X, %2.2X, %2.2X, %2.2X)\n", fileName,
+ BYTE(startBytes[0]), BYTE(startBytes[1]), BYTE(startBytes[2]), BYTE(startBytes[3]));
+ guiSupport->postErrorMessage(errorMessage, "Text File Error");
+ fclose(f);
+ return 0;
+ }
+
+ fileSize -= signatureLength;
+ fseek(f, signatureLength, SEEK_SET);
+ byteBuffer = new char[fileSize];
+
+ if(byteBuffer == 0) {
+ sprintf(errorMessage,"Couldn't get memory for reading %s: %s \n", fileName, strerror(errno));
+ guiSupport->postErrorMessage(errorMessage, "Text File Error");
+ fclose(f);
+ return 0;
+ }
+
+ fread(byteBuffer, sizeof(char), fileSize, f);
+ if( ferror(f) ) {
+ sprintf(errorMessage,"Couldn't read %s: %s \n", fileName, strerror(errno));
+ guiSupport->postErrorMessage(errorMessage, "Text File Error");
+ fclose(f);
+ delete[] byteBuffer;
+ return 0;
+ }
+ fclose(f);
+
+ UnicodeString myText(byteBuffer, fileSize, cp);
+
+ delete[] byteBuffer;
+
+ charCount = myText.length();
+ charBuffer = LE_NEW_ARRAY(UChar, charCount + 1);
+ if(charBuffer == 0) {
+ sprintf(errorMessage,"Couldn't get memory for reading %s: %s \n", fileName, strerror(errno));
+ guiSupport->postErrorMessage(errorMessage, "Text File Error");
+ return 0;
+ }
+
+ myText.extract(0, myText.length(), charBuffer);
+ charBuffer[charCount] = 0; // NULL terminate for easier reading in the debugger
+
+ return charBuffer;
+}
+