static int32_t pkg_installFileMode(const char *installDir, const char *srcDir, const char *fileListName) { int32_t result = 0; char cmd[SMALL_BUFFER_MAX_SIZE] = ""; if (!T_FileStream_file_exists(installDir)) { UErrorCode status = U_ZERO_ERROR; uprv_mkdir(installDir, &status); if (U_FAILURE(status)) { fprintf(stderr, "Error creating installation directory: %s\n", installDir); return -1; } } #ifndef U_WINDOWS_WITH_MSVC char buffer[SMALL_BUFFER_MAX_SIZE] = ""; FileStream *f = T_FileStream_open(fileListName, "r"); if (f != NULL) { for(;;) { if (T_FileStream_readLine(f, buffer, SMALL_BUFFER_MAX_SIZE) != NULL) { /* Remove new line character. */ buffer[uprv_strlen(buffer)-1] = 0; sprintf(cmd, "%s %s%s%s %s%s%s", pkgDataFlags[INSTALL_CMD], srcDir, PKGDATA_FILE_SEP_STRING, buffer, installDir, PKGDATA_FILE_SEP_STRING, buffer); result = system(cmd); if (result != 0) { fprintf(stderr, "Failed to install data file with command: %s\n", cmd); break; } } else { if (!T_FileStream_eof(f)) { fprintf(stderr, "Failed to read line from file: %s\n", fileListName); result = -1; } break; } } T_FileStream_close(f); } else { result = -1; fprintf(stderr, "Unable to open list file: %s\n", fileListName); } #else sprintf(cmd, "%s %s %s %s", WIN_INSTALL_CMD, srcDir, installDir, WIN_INSTALL_CMD_FLAGS); result = system(cmd); if (result != 0) { fprintf(stderr, "Failed to install data file with command: %s\n", cmd); } #endif return result; }
void NormalizerConformanceTest::TestConformance(FileStream *input, int32_t options) { enum { BUF_SIZE = 1024 }; char lineBuf[BUF_SIZE]; UnicodeString fields[FIELD_COUNT]; UErrorCode status = U_ZERO_ERROR; int32_t passCount = 0; int32_t failCount = 0; UChar32 c; if(input==NULL) { return; } // UnicodeSet for all code points that are not mentioned in NormalizationTest.txt UnicodeSet other(0, 0x10ffff); int32_t count, countMoreCases = UPRV_LENGTHOF(moreCases); for (count = 1;;++count) { if (!T_FileStream_eof(input)) { T_FileStream_readLine(input, lineBuf, (int32_t)sizeof(lineBuf)); } else { // once NormalizationTest.txt is finished, use moreCases[] if(count > countMoreCases) { count = 0; } else if(count == countMoreCases) { // all done break; } uprv_strcpy(lineBuf, moreCases[count]); } if (lineBuf[0] == 0 || lineBuf[0] == '\n' || lineBuf[0] == '\r') continue; // Expect 5 columns of this format: // 1E0C;1E0C;0044 0323;1E0C;0044 0323; # <comments> // Parse out the comment. if (lineBuf[0] == '#') continue; // Read separator lines starting with '@' if (lineBuf[0] == '@') { logln(lineBuf); continue; } // Parse out the fields if (!hexsplit(lineBuf, ';', fields, FIELD_COUNT)) { errln((UnicodeString)"Unable to parse line " + count); break; // Syntax error } // Remove a single code point from the "other" UnicodeSet if(fields[0].length()==fields[0].moveIndex32(0, 1)) { c=fields[0].char32At(0); if(0xac20<=c && c<=0xd73f && quick) { // not an exhaustive test run: skip most Hangul syllables if(c==0xac20) { other.remove(0xac20, 0xd73f); } continue; } other.remove(c); } if (checkConformance(fields, lineBuf, options, status)) { ++passCount; } else { ++failCount; if(status == U_FILE_ACCESS_ERROR) { dataerrln("Something is wrong with the normalizer, skipping the rest of the test."); break; } } if ((count % 1000) == 0) { logln("Line %d", count); } } T_FileStream_close(input); /* * Test that all characters that are not mentioned * as single code points in column 1 * do not change under any normalization. */ // remove U+ffff because that is the end-of-iteration sentinel value other.remove(0xffff); for(c=0; c<=0x10ffff; quick ? c+=113 : ++c) { if(0x30000<=c && c<0xe0000) { c=0xe0000; } if(!other.contains(c)) { continue; } fields[0]=fields[1]=fields[2]=fields[3]=fields[4].setTo(c); sprintf(lineBuf, "not mentioned code point U+%04lx", (long)c); if (checkConformance(fields, lineBuf, options, status)) { ++passCount; } else { ++failCount; if(status == U_FILE_ACCESS_ERROR) { dataerrln("Something is wrong with the normalizer, skipping the rest of the test.: %s", u_errorName(status)); break; } } if ((c % 0x1000) == 0) { logln("Code point U+%04lx", c); } } if (failCount != 0) { dataerrln((UnicodeString)"Total: " + failCount + " lines/code points failed, " + passCount + " lines/code points passed"); } else { logln((UnicodeString)"Total: " + passCount + " lines/code points passed"); } }