16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 2002-2012, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Defines _XOPEN_SOURCE for access to POSIX functions.
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Must be before any other #includes.
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uposixdefs.h"
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uperf.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uoptions.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_CONVERSION
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUPerfFunction::~UPerfFunction() {}
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char delim = '/';
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t execCount = 0;
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUPerfTest* UPerfTest::gTest = NULL;
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int MAXLINES = 40000;
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char UPerfTest::gUsageString[] =
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "Usage: %s [OPTIONS] [FILES]\n"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\tReads the input file and prints out time taken in seconds\n"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "Options:\n"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-h or -? or --help   this usage text\n"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-v or --verbose      print extra information when processing files\n"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-s or --sourcedir    source directory for files followed by path\n"
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t                     followed by path\n"
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-e or --encoding     encoding of source files\n"
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-u or --uselen       perform timing analysis on non-null terminated buffer using length\n"
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-f or --file-name    file to be used as input data\n"
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-p or --passes       Number of passes to be performed. Requires Numeric argument.\n"
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t                     Cannot be used with --time\n"
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-i or --iterations   Number of iterations to be performed. Requires Numeric argument\n"
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-t or --time         Threshold time for looping until in seconds. Requires Numeric argument.\n"
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t                     Cannot be used with --iterations\n"
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-l or --line-mode    The data file should be processed in line mode\n"
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-b or --bulk-mode    The data file should be processed in file based.\n"
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t                     Cannot be used with --line-mode\n"
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "\t-L or --locale       Locale for the test\n";
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    HELP1,
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    HELP2,
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    VERBOSE,
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SOURCEDIR,
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ENCODING,
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    USELEN,
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FILE_NAME,
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    PASSES,
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ITERATIONS,
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TIME,
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    LINE_MODE,
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BULK_MODE,
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    LOCALE,
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    OPTIONS_COUNT
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UOption options[OPTIONS_COUNT+20]={
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_HELP_H,
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_HELP_QUESTION_MARK,
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_VERBOSE,
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_SOURCEDIR,
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_ENCODING,
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_DEF( "uselen",        'u', UOPT_NO_ARG),
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_DEF( "file-name",     'f', UOPT_REQUIRES_ARG),
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_DEF( "passes",        'p', UOPT_REQUIRES_ARG),
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_DEF( "iterations",    'i', UOPT_REQUIRES_ARG),
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_DEF( "time",          't', UOPT_REQUIRES_ARG),
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_DEF( "line-mode",     'l', UOPT_NO_ARG),
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_DEF( "bulk-mode",     'b', UOPT_NO_ARG),
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UOPTION_DEF( "locale",        'L', UOPT_REQUIRES_ARG)
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUPerfTest::UPerfTest(int32_t argc, const char* argv[], UErrorCode& status)
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        : _argc(argc), _argv(argv), _addUsage(NULL),
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          ucharBuf(NULL), encoding(""),
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          uselen(FALSE),
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          fileName(NULL), sourceDir("."),
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          lines(NULL), numLines(0), line_mode(TRUE),
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          buffer(NULL), bufferLen(0),
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          verbose(FALSE), bulk_mode(FALSE),
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          passes(1), iterations(0), time(0),
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          locale(NULL) {
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    init(NULL, 0, status);
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUPerfTest::UPerfTest(int32_t argc, const char* argv[],
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     UOption addOptions[], int32_t addOptionsCount,
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     const char *addUsage,
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     UErrorCode& status)
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        : _argc(argc), _argv(argv), _addUsage(addUsage),
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          ucharBuf(NULL), encoding(""),
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          uselen(FALSE),
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          fileName(NULL), sourceDir("."),
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          lines(NULL), numLines(0), line_mode(TRUE),
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          buffer(NULL), bufferLen(0),
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          verbose(FALSE), bulk_mode(FALSE),
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          passes(1), iterations(0), time(0),
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          locale(NULL) {
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    init(addOptions, addOptionsCount, status);
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid UPerfTest::init(UOption addOptions[], int32_t addOptionsCount,
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     UErrorCode& status) {
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //initialize the argument list
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_MAIN_INIT_ARGS(_argc, _argv);
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    resolvedFileName = NULL;
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // add specific options
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t optionsCount = OPTIONS_COUNT;
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (addOptionsCount > 0) {
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memcpy(options+optionsCount, addOptions, addOptionsCount*sizeof(UOption));
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        optionsCount += addOptionsCount;
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //parse the arguments
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    _remainingArgc = u_parseArgs(_argc, (char**)_argv, optionsCount, options);
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // copy back values for additional options
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (addOptionsCount > 0) {
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memcpy(addOptions, options+OPTIONS_COUNT, addOptionsCount*sizeof(UOption));
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Now setup the arguments
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(_argc==1 || options[HELP1].doesOccur || options[HELP2].doesOccur) {
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ILLEGAL_ARGUMENT_ERROR;
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[VERBOSE].doesOccur) {
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        verbose = TRUE;
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[SOURCEDIR].doesOccur) {
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sourceDir = options[SOURCEDIR].value;
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[ENCODING].doesOccur) {
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        encoding = options[ENCODING].value;
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[USELEN].doesOccur) {
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uselen = TRUE;
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[FILE_NAME].doesOccur){
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fileName = options[FILE_NAME].value;
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[PASSES].doesOccur) {
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        passes = atoi(options[PASSES].value);
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[ITERATIONS].doesOccur) {
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        iterations = atoi(options[ITERATIONS].value);
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(options[TIME].doesOccur) {
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ILLEGAL_ARGUMENT_ERROR;
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(options[TIME].doesOccur) {
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        time = atoi(options[TIME].value);
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        iterations = 1000; // some default
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[LINE_MODE].doesOccur) {
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        line_mode = TRUE;
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bulk_mode = FALSE;
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[BULK_MODE].doesOccur) {
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bulk_mode = TRUE;
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        line_mode = FALSE;
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(options[LOCALE].doesOccur) {
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        locale = options[LOCALE].value;
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t len = 0;
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(fileName!=NULL){
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //pre-flight
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucbuf_resolveFileName(sourceDir, fileName, NULL, &len, &status);
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resolvedFileName = (char*) uprv_malloc(len);
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(resolvedFileName==NULL){
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status= U_MEMORY_ALLOCATION_ERROR;
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(status == U_BUFFER_OVERFLOW_ERROR){
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucbuf_resolveFileName(sourceDir, fileName, resolvedFileName, &len, &status);
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucharBuf = ucbuf_open(resolvedFileName,&encoding,TRUE,FALSE,&status);
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status)){
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("Could not open the input file %s. Error: %s\n", fileName, u_errorName(status));
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgULine* UPerfTest::getLines(UErrorCode& status){
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (lines != NULL) {
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return lines;  // don't do it again
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    lines     = new ULine[MAXLINES];
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int maxLines = MAXLINES;
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    numLines=0;
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar* line=NULL;
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t len =0;
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (;;) {
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        line = ucbuf_readline(ucharBuf,&len,&status);
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(line == NULL || U_FAILURE(status)){
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        lines[numLines].name  = new UChar[len];
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        lines[numLines].len   = len;
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memcpy(lines[numLines].name, line, len * U_SIZEOF_UCHAR);
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numLines++;
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = 0;
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (numLines >= maxLines) {
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            maxLines += MAXLINES;
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ULine *newLines = new ULine[maxLines];
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(newLines == NULL) {
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fprintf(stderr, "Out of memory reading line %d.\n", (int)numLines);
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                status= U_MEMORY_ALLOCATION_ERROR;
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                delete []lines;
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return NULL;
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memcpy(newLines, lines, numLines*sizeof(ULine));
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            delete []lines;
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            lines = newLines;
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return lines;
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UChar* UPerfTest::getBuffer(int32_t& len, UErrorCode& status){
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    len = ucbuf_size(ucharBuf);
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    buffer =  (UChar*) uprv_malloc(U_SIZEOF_UCHAR * (len+1));
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strncpy(buffer,ucbuf_getBuffer(ucharBuf,&bufferLen,&status),len);
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    buffer[len]=0;
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    len = bufferLen;
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return buffer;
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool UPerfTest::run(){
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(_remainingArgc==1){
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Testing all methods
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return runTest();
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool res=FALSE;
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Test only the specified fucntion
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int i = 1; i < _remainingArgc; ++i) {
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (_argv[i][0] != '-') {
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char* name = (char*) _argv[i];
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(verbose==TRUE){
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                //fprintf(stdout, "\n=== Handling test: %s: ===\n", name);
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                //fprintf(stdout, "\n%s:\n", name);
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char* parameter = strchr( name, '@' );
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (parameter) {
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *parameter = 0;
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                parameter += 1;
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            execCount = 0;
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            res = runTest( name, parameter );
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!res || (execCount <= 0)) {
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fprintf(stdout, "\n---ERROR: Test doesn't exist: %s!\n", name);
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return FALSE;
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return res;
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool UPerfTest::runTest(char* name, char* par ){
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool rval;
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char* pos = NULL;
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (name)
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = strchr( name, delim ); // check if name contains path (by looking for '/')
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos) {
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        path = pos+1;   // store subpath for calling subtest
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pos = 0;       // split into two strings
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }else{
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        path = NULL;
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!name || (name[0] == 0) || (strcmp(name, "*") == 0)) {
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        rval = runTestLoop( NULL, NULL );
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }else if (strcmp( name, "LIST" ) == 0) {
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        this->usage();
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        rval = TRUE;
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }else{
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        rval = runTestLoop( name, par );
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos)
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *pos = delim;  // restore original value at pos
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return rval;
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid UPerfTest::setPath( char* pathVal )
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    this->path = pathVal;
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// call individual tests, to be overriden to call implementations
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUPerfFunction* UPerfTest::runIndexedTest( int32_t /*index*/, UBool /*exec*/, const char* & /*name*/, char* /*par*/ )
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // to be overriden by a method like:
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch (index) {
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 0: name = "First Test"; if (exec) FirstTest( par ); break;
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 1: name = "Second Test"; if (exec) SecondTest( par ); break;
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default: name = ""; break;
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    */
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr,"*** runIndexedTest needs to be overriden! ***");
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return NULL;
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool UPerfTest::runTestLoop( char* testname, char* par )
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t    index = 0;
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char*   name;
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool  run_this_test;
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool  rval = FALSE;
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UPerfTest* saveTest = gTest;
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gTest = this;
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t loops = 0;
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double t=0;
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t n = 1;
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    long ops;
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    do {
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        this->runIndexedTest( index, FALSE, name );
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!name || (name[0] == 0))
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!testname) {
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            run_this_test = TRUE;
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else{
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            run_this_test = (UBool) (strcmp( name, testname ) == 0);
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (run_this_test) {
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UPerfFunction* testFunction = this->runIndexedTest( index, TRUE, name, par );
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            execCount++;
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            rval=TRUE;
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(testFunction==NULL){
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fprintf(stderr,"%s function returned NULL", name);
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return FALSE;
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ops = testFunction->getOperationsPerIteration();
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (ops < 1) {
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fprintf(stderr, "%s returned an illegal operations/iteration()\n", name);
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return FALSE;
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(iterations == 0) {
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                n = time;
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                // Run for specified duration in seconds
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(verbose==TRUE){
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fprintf(stdout,"= %s calibrating %i seconds \n", name, (int)n);
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                //n *=  1000; // s => ms
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                //System.out.println("# " + meth.getName() + " " + n + " sec");
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t failsafe = 1; // last resort for very fast methods
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                t = 0;
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                while (t < (int)(n * 0.9)) { // 90% is close enough
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (loops == 0 || t == 0) {
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        loops = failsafe;
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        failsafe *= 10;
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else {
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        //System.out.println("# " + meth.getName() + " x " + loops + " = " + t);
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        loops = (int)((double)n / t * loops + 0.5);
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (loops == 0) {
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            fprintf(stderr,"Unable to converge on desired duration");
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            return FALSE;
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    //System.out.println("# " + meth.getName() + " x " + loops);
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    t = testFunction->time(loops,&status);
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(U_FAILURE(status)){
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        printf("Performance test failed with error: %s \n", u_errorName(status));
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        break;
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                loops = iterations;
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            double min_t=1000000.0, sum_t=0.0;
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            long events = -1;
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for(int32_t ps =0; ps < passes; ps++){
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fprintf(stdout,"= %s begin " ,name);
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(verbose==TRUE){
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(iterations > 0) {
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        fprintf(stdout, "%i\n", (int)loops);
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else {
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        fprintf(stdout, "%i\n", (int)n);
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fprintf(stdout, "\n");
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                t = testFunction->time(loops, &status);
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(U_FAILURE(status)){
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    printf("Performance test failed with error: %s \n", u_errorName(status));
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    break;
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                sum_t+=t;
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(t<min_t) {
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    min_t=t;
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                events = testFunction->getEventsPerIteration();
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                //print info only in verbose mode
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(verbose==TRUE){
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(events == -1){
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        fprintf(stdout, "= %s end: %f loops: %i operations: %li \n", name, t, (int)loops, ops);
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }else{
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        fprintf(stdout, "= %s end: %f loops: %i operations: %li events: %li\n", name, t, (int)loops, ops, events);
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }else{
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(events == -1){
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        fprintf(stdout,"= %s end %f %i %li\n", name, t, (int)loops, ops);
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }else{
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        fprintf(stdout,"= %s end %f %i %li %li\n", name, t, (int)loops, ops, events);
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(verbose && U_SUCCESS(status)) {
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                double avg_t = sum_t/passes;
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (loops == 0 || ops == 0) {
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fprintf(stderr, "%s did not run\n", name);
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                else if(events == -1) {
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fprintf(stdout, "%%= %s avg: %.4g loops: %i avg/op: %.4g ns\n",
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            name, avg_t, (int)loops, (avg_t*1E9)/(loops*ops));
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fprintf(stdout, "_= %s min: %.4g loops: %i min/op: %.4g ns\n",
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            name, min_t, (int)loops, (min_t*1E9)/(loops*ops));
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                else {
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fprintf(stdout, "%%= %s avg: %.4g loops: %i avg/op: %.4g ns avg/event: %.4g ns\n",
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            name, avg_t, (int)loops, (avg_t*1E9)/(loops*ops), (avg_t*1E9)/(loops*events));
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fprintf(stdout, "_= %s min: %.4g loops: %i min/op: %.4g ns min/event: %.4g ns\n",
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            name, min_t, (int)loops, (min_t*1E9)/(loops*ops), (min_t*1E9)/(loops*events));
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            delete testFunction;
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        index++;
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }while(name);
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gTest = saveTest;
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return rval;
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Print a usage message for this test class.
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid UPerfTest::usage( void )
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    puts(gUsageString);
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (_addUsage != NULL) {
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        puts(_addUsage);
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool save_verbose = verbose;
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verbose = TRUE;
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stdout,"Test names:\n");
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stdout,"-----------\n");
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t index = 0;
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* name = NULL;
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    do{
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        this->runIndexedTest( index, FALSE, name );
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!name)
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stdout, "%s\n", name);
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        index++;
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }while (name && (name[0] != 0));
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verbose = save_verbose;
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid UPerfTest::setCaller( UPerfTest* callingTest )
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    caller = callingTest;
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (caller) {
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        verbose = caller->verbose;
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool UPerfTest::callTest( UPerfTest& testToBeCalled, char* par )
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    execCount--; // correct a previously assumed test-exec, as this only calls a subtest
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testToBeCalled.setCaller( this );
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return testToBeCalled.runTest( path, par );
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUPerfTest::~UPerfTest(){
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(lines!=NULL){
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete[] lines;
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(buffer!=NULL){
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_free(buffer);
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(resolvedFileName!=NULL){
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_free(resolvedFileName);
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucbuf_close(ucharBuf);
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
534