1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT:
354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * Copyright (c) 2002-2012, International Business Machines Corporation and
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
7103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius// Defines _XOPEN_SOURCE for access to POSIX functions.
8103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius// Must be before any other #includes.
9103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "uposixdefs.h"
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uperf.h"
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uoptions.h"
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h"
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h>
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_CONVERSION
18103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
19103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusUPerfFunction::~UPerfFunction() {}
20103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char delim = '/';
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t execCount = 0;
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUPerfTest* UPerfTest::gTest = NULL;
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int MAXLINES = 40000;
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char UPerfTest::gUsageString[] =
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "Usage: %s [OPTIONS] [FILES]\n"
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\tReads the input file and prints out time taken in seconds\n"
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "Options:\n"
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-h or -? or --help   this usage text\n"
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-v or --verbose      print extra information when processing files\n"
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-s or --sourcedir    source directory for files followed by path\n"
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t                     followed by path\n"
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-e or --encoding     encoding of source files\n"
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-u or --uselen       perform timing analysis on non-null terminated buffer using length\n"
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-f or --file-name    file to be used as input data\n"
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-p or --passes       Number of passes to be performed. Requires Numeric argument.\n"
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t                     Cannot be used with --time\n"
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-i or --iterations   Number of iterations to be performed. Requires Numeric argument\n"
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-t or --time         Threshold time for looping until in seconds. Requires Numeric argument.\n"
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t                     Cannot be used with --iterations\n"
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-l or --line-mode    The data file should be processed in line mode\n"
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-b or --bulk-mode    The data file should be processed in file based.\n"
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t                     Cannot be used with --line-mode\n"
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "\t-L or --locale       Locale for the test\n";
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruenum
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    HELP1,
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    HELP2,
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    VERBOSE,
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    SOURCEDIR,
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ENCODING,
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    USELEN,
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    FILE_NAME,
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PASSES,
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ITERATIONS,
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TIME,
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    LINE_MODE,
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    BULK_MODE,
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    LOCALE,
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    OPTIONS_COUNT
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UOption options[OPTIONS_COUNT+20]={
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_HELP_H,
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_HELP_QUESTION_MARK,
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_VERBOSE,
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_SOURCEDIR,
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_ENCODING,
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_DEF( "uselen",        'u', UOPT_NO_ARG),
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_DEF( "file-name",     'f', UOPT_REQUIRES_ARG),
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_DEF( "passes",        'p', UOPT_REQUIRES_ARG),
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_DEF( "iterations",    'i', UOPT_REQUIRES_ARG),
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_DEF( "time",          't', UOPT_REQUIRES_ARG),
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_DEF( "line-mode",     'l', UOPT_NO_ARG),
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_DEF( "bulk-mode",     'b', UOPT_NO_ARG),
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UOPTION_DEF( "locale",        'L', UOPT_REQUIRES_ARG)
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUPerfTest::UPerfTest(int32_t argc, const char* argv[], UErrorCode& status)
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        : _argc(argc), _argv(argv), _addUsage(NULL),
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          ucharBuf(NULL), encoding(""),
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          uselen(FALSE),
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          fileName(NULL), sourceDir("."),
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          lines(NULL), numLines(0), line_mode(TRUE),
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          buffer(NULL), bufferLen(0),
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          verbose(FALSE), bulk_mode(FALSE),
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          passes(1), iterations(0), time(0),
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          locale(NULL) {
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    init(NULL, 0, status);
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUPerfTest::UPerfTest(int32_t argc, const char* argv[],
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     UOption addOptions[], int32_t addOptionsCount,
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     const char *addUsage,
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     UErrorCode& status)
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        : _argc(argc), _argv(argv), _addUsage(addUsage),
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          ucharBuf(NULL), encoding(""),
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          uselen(FALSE),
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          fileName(NULL), sourceDir("."),
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          lines(NULL), numLines(0), line_mode(TRUE),
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          buffer(NULL), bufferLen(0),
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          verbose(FALSE), bulk_mode(FALSE),
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          passes(1), iterations(0), time(0),
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          locale(NULL) {
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    init(addOptions, addOptionsCount, status);
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid UPerfTest::init(UOption addOptions[], int32_t addOptionsCount,
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     UErrorCode& status) {
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    //initialize the argument list
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    U_MAIN_INIT_ARGS(_argc, _argv);
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
11585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    resolvedFileName = NULL;
11685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // add specific options
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t optionsCount = OPTIONS_COUNT;
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (addOptionsCount > 0) {
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        memcpy(options+optionsCount, addOptions, addOptionsCount*sizeof(UOption));
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        optionsCount += addOptionsCount;
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    //parse the arguments
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    _remainingArgc = u_parseArgs(_argc, (char**)_argv, optionsCount, options);
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // copy back values for additional options
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (addOptionsCount > 0) {
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        memcpy(addOptions, options+OPTIONS_COUNT, addOptionsCount*sizeof(UOption));
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Now setup the arguments
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(_argc==1 || options[HELP1].doesOccur || options[HELP2].doesOccur) {
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ILLEGAL_ARGUMENT_ERROR;
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(options[VERBOSE].doesOccur) {
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        verbose = TRUE;
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(options[SOURCEDIR].doesOccur) {
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sourceDir = options[SOURCEDIR].value;
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(options[ENCODING].doesOccur) {
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        encoding = options[ENCODING].value;
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(options[USELEN].doesOccur) {
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uselen = TRUE;
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(options[FILE_NAME].doesOccur){
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fileName = options[FILE_NAME].value;
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(options[PASSES].doesOccur) {
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        passes = atoi(options[PASSES].value);
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(options[ITERATIONS].doesOccur) {
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        iterations = atoi(options[ITERATIONS].value);
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(options[TIME].doesOccur) {
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            status = U_ILLEGAL_ARGUMENT_ERROR;
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else if(options[TIME].doesOccur) {
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        time = atoi(options[TIME].value);
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        iterations = 1000; // some default
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(options[LINE_MODE].doesOccur) {
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        line_mode = TRUE;
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        bulk_mode = FALSE;
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(options[BULK_MODE].doesOccur) {
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        bulk_mode = TRUE;
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        line_mode = FALSE;
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(options[LOCALE].doesOccur) {
18485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        locale = options[LOCALE].value;
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t len = 0;
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(fileName!=NULL){
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        //pre-flight
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucbuf_resolveFileName(sourceDir, fileName, NULL, &len, &status);
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        resolvedFileName = (char*) uprv_malloc(len);
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(resolvedFileName==NULL){
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            status= U_MEMORY_ALLOCATION_ERROR;
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(status == U_BUFFER_OVERFLOW_ERROR){
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            status = U_ZERO_ERROR;
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucbuf_resolveFileName(sourceDir, fileName, resolvedFileName, &len, &status);
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucharBuf = ucbuf_open(resolvedFileName,&encoding,TRUE,FALSE,&status);
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_FAILURE(status)){
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            printf("Could not open the input file %s. Error: %s\n", fileName, u_errorName(status));
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruULine* UPerfTest::getLines(UErrorCode& status){
210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return NULL;
212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (lines != NULL) {
214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return lines;  // don't do it again
215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    lines     = new ULine[MAXLINES];
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int maxLines = MAXLINES;
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    numLines=0;
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* line=NULL;
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t len =0;
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (;;) {
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        line = ucbuf_readline(ucharBuf,&len,&status);
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(line == NULL || U_FAILURE(status)){
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        lines[numLines].name  = new UChar[len];
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        lines[numLines].len   = len;
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        memcpy(lines[numLines].name, line, len * U_SIZEOF_UCHAR);
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        numLines++;
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        len = 0;
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (numLines >= maxLines) {
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            maxLines += MAXLINES;
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ULine *newLines = new ULine[maxLines];
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(newLines == NULL) {
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                fprintf(stderr, "Out of memory reading line %d.\n", (int)numLines);
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                status= U_MEMORY_ALLOCATION_ERROR;
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                delete []lines;
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return NULL;
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            memcpy(newLines, lines, numLines*sizeof(ULine));
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            delete []lines;
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            lines = newLines;
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return lines;
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst UChar* UPerfTest::getBuffer(int32_t& len, UErrorCode& status){
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    len = ucbuf_size(ucharBuf);
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    buffer =  (UChar*) uprv_malloc(U_SIZEOF_UCHAR * (len+1));
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_strncpy(buffer,ucbuf_getBuffer(ucharBuf,&bufferLen,&status),len);
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    buffer[len]=0;
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    len = bufferLen;
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return buffer;
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool UPerfTest::run(){
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(_remainingArgc==1){
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // Testing all methods
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return runTest();
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool res=FALSE;
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Test only the specified fucntion
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (int i = 1; i < _remainingArgc; ++i) {
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (_argv[i][0] != '-') {
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            char* name = (char*) _argv[i];
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(verbose==TRUE){
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                //fprintf(stdout, "\n=== Handling test: %s: ===\n", name);
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                //fprintf(stdout, "\n%s:\n", name);
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            char* parameter = strchr( name, '@' );
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (parameter) {
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                *parameter = 0;
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                parameter += 1;
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            execCount = 0;
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            res = runTest( name, parameter );
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (!res || (execCount <= 0)) {
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                fprintf(stdout, "\n---ERROR: Test doesn't exist: %s!\n", name);
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return FALSE;
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return res;
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool UPerfTest::runTest(char* name, char* par ){
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool rval;
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* pos = NULL;
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (name)
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        pos = strchr( name, delim ); // check if name contains path (by looking for '/')
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (pos) {
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        path = pos+1;   // store subpath for calling subtest
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *pos = 0;       // split into two strings
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }else{
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        path = NULL;
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (!name || (name[0] == 0) || (strcmp(name, "*") == 0)) {
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        rval = runTestLoop( NULL, NULL );
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }else if (strcmp( name, "LIST" ) == 0) {
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        this->usage();
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        rval = TRUE;
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }else{
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        rval = runTestLoop( name, par );
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (pos)
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *pos = delim;  // restore original value at pos
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return rval;
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid UPerfTest::setPath( char* pathVal )
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    this->path = pathVal;
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// call individual tests, to be overriden to call implementations
32554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUPerfFunction* UPerfTest::runIndexedTest( int32_t /*index*/, UBool /*exec*/, const char* & /*name*/, char* /*par*/ )
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // to be overriden by a method like:
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    switch (index) {
330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case 0: name = "First Test"; if (exec) FirstTest( par ); break;
331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case 1: name = "Second Test"; if (exec) SecondTest( par ); break;
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        default: name = ""; break;
333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    */
335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fprintf(stderr,"*** runIndexedTest needs to be overriden! ***");
336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return NULL;
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool UPerfTest::runTestLoop( char* testname, char* par )
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t    index = 0;
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char*   name;
344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool  run_this_test;
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool  rval = FALSE;
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UPerfTest* saveTest = gTest;
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    gTest = this;
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t loops = 0;
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double t=0;
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t n = 1;
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    long ops;
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    do {
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        this->runIndexedTest( index, FALSE, name );
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (!name || (name[0] == 0))
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (!testname) {
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            run_this_test = TRUE;
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }else{
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            run_this_test = (UBool) (strcmp( name, testname ) == 0);
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (run_this_test) {
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UPerfFunction* testFunction = this->runIndexedTest( index, TRUE, name, par );
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            execCount++;
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            rval=TRUE;
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(testFunction==NULL){
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                fprintf(stderr,"%s function returned NULL", name);
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return FALSE;
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ops = testFunction->getOperationsPerIteration();
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (ops < 1) {
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                fprintf(stderr, "%s returned an illegal operations/iteration()\n", name);
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return FALSE;
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(iterations == 0) {
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                n = time;
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                // Run for specified duration in seconds
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(verbose==TRUE){
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    fprintf(stdout,"= %s calibrating %i seconds \n", name, (int)n);
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                //n *=  1000; // s => ms
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                //System.out.println("# " + meth.getName() + " " + n + " sec");
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                int32_t failsafe = 1; // last resort for very fast methods
385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                t = 0;
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                while (t < (int)(n * 0.9)) { // 90% is close enough
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    if (loops == 0 || t == 0) {
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        loops = failsafe;
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        failsafe *= 10;
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    } else {
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        //System.out.println("# " + meth.getName() + " x " + loops + " = " + t);
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        loops = (int)((double)n / t * loops + 0.5);
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        if (loops == 0) {
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                            fprintf(stderr,"Unable to converge on desired duration");
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                            return FALSE;
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        }
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    //System.out.println("# " + meth.getName() + " x " + loops);
399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    t = testFunction->time(loops,&status);
400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    if(U_FAILURE(status)){
401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        printf("Performance test failed with error: %s \n", u_errorName(status));
402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        break;
403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            } else {
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                loops = iterations;
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            double min_t=1000000.0, sum_t=0.0;
410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            long events = -1;
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for(int32_t ps =0; ps < passes; ps++){
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                fprintf(stdout,"= %s begin " ,name);
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(verbose==TRUE){
415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    if(iterations > 0) {
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        fprintf(stdout, "%i\n", (int)loops);
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    } else {
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        fprintf(stdout, "%i\n", (int)n);
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                } else {
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    fprintf(stdout, "\n");
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                t = testFunction->time(loops, &status);
424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(U_FAILURE(status)){
425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    printf("Performance test failed with error: %s \n", u_errorName(status));
426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    break;
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                sum_t+=t;
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(t<min_t) {
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    min_t=t;
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                events = testFunction->getEventsPerIteration();
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                //print info only in verbose mode
434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(verbose==TRUE){
435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    if(events == -1){
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        fprintf(stdout, "= %s end: %f loops: %i operations: %li \n", name, t, (int)loops, ops);
437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }else{
438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        fprintf(stdout, "= %s end: %f loops: %i operations: %li events: %li\n", name, t, (int)loops, ops, events);
439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }else{
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    if(events == -1){
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        fprintf(stdout,"= %s end %f %i %li\n", name, t, (int)loops, ops);
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }else{
444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        fprintf(stdout,"= %s end %f %i %li %li\n", name, t, (int)loops, ops, events);
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(verbose && U_SUCCESS(status)) {
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                double avg_t = sum_t/passes;
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if (loops == 0 || ops == 0) {
451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    fprintf(stderr, "%s did not run\n", name);
452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                else if(events == -1) {
454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    fprintf(stdout, "%%= %s avg: %.4g loops: %i avg/op: %.4g ns\n",
455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                            name, avg_t, (int)loops, (avg_t*1E9)/(loops*ops));
456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    fprintf(stdout, "_= %s min: %.4g loops: %i min/op: %.4g ns\n",
457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                            name, min_t, (int)loops, (min_t*1E9)/(loops*ops));
458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                else {
460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    fprintf(stdout, "%%= %s avg: %.4g loops: %i avg/op: %.4g ns avg/event: %.4g ns\n",
461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                            name, avg_t, (int)loops, (avg_t*1E9)/(loops*ops), (avg_t*1E9)/(loops*events));
462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    fprintf(stdout, "_= %s min: %.4g loops: %i min/op: %.4g ns min/event: %.4g ns\n",
463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                            name, min_t, (int)loops, (min_t*1E9)/(loops*ops), (min_t*1E9)/(loops*events));
464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            delete testFunction;
467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        index++;
469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }while(name);
470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    gTest = saveTest;
472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return rval;
473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Print a usage message for this test class.
477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid UPerfTest::usage( void )
479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    puts(gUsageString);
481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (_addUsage != NULL) {
482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        puts(_addUsage);
483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool save_verbose = verbose;
486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    verbose = TRUE;
487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fprintf(stdout,"Test names:\n");
488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fprintf(stdout,"-----------\n");
489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t index = 0;
491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* name = NULL;
492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    do{
493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        this->runIndexedTest( index, FALSE, name );
494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (!name)
495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
496b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        fprintf(stdout, "%s\n", name);
497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        index++;
498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }while (name && (name[0] != 0));
499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    verbose = save_verbose;
500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid UPerfTest::setCaller( UPerfTest* callingTest )
506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    caller = callingTest;
508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (caller) {
509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        verbose = caller->verbose;
510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool UPerfTest::callTest( UPerfTest& testToBeCalled, char* par )
514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    execCount--; // correct a previously assumed test-exec, as this only calls a subtest
516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testToBeCalled.setCaller( this );
517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return testToBeCalled.runTest( path, par );
518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUPerfTest::~UPerfTest(){
521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(lines!=NULL){
522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete[] lines;
523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(buffer!=NULL){
525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_free(buffer);
526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(resolvedFileName!=NULL){
528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_free(resolvedFileName);
529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucbuf_close(ucharBuf);
531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
534