| Index: source/tools/makeconv/makeconv.cpp
 | 
| diff --git a/source/tools/makeconv/makeconv.c b/source/tools/makeconv/makeconv.cpp
 | 
| similarity index 92%
 | 
| rename from source/tools/makeconv/makeconv.c
 | 
| rename to source/tools/makeconv/makeconv.cpp
 | 
| index 4eabcba51f5135a651a8511dc1dce478792ada37..e7e4f33e98286b26a0dc8d8698583d52fdd7a828 100644
 | 
| --- a/source/tools/makeconv/makeconv.c
 | 
| +++ b/source/tools/makeconv/makeconv.cpp
 | 
| @@ -1,13 +1,13 @@
 | 
|  /*
 | 
|   ********************************************************************************
 | 
|   *
 | 
| - *   Copyright (C) 1998-2014, International Business Machines
 | 
| + *   Copyright (C) 1998-2015, International Business Machines
 | 
|   *   Corporation and others.  All Rights Reserved.
 | 
|   *
 | 
|   ********************************************************************************
 | 
|   *
 | 
|   *
 | 
| - *  makeconv.c:
 | 
| + *  makeconv.cpp:
 | 
|   *  tool creating a binary (compressed) representation of the conversion mapping
 | 
|   *  table (IBM NLTC ucmap format).
 | 
|   *
 | 
| @@ -18,6 +18,7 @@
 | 
|  #include <stdio.h>
 | 
|  #include "unicode/putil.h"
 | 
|  #include "unicode/ucnv_err.h"
 | 
| +#include "charstr.h"
 | 
|  #include "ucnv_bld.h"
 | 
|  #include "ucnv_imp.h"
 | 
|  #include "ucnv_cnv.h"
 | 
| @@ -70,12 +71,13 @@ cleanupConvData(ConvData *data) {
 | 
|  /*
 | 
|   * from ucnvstat.c - static prototypes of data-based converters
 | 
|   */
 | 
| -extern const UConverterStaticData * ucnv_converterStaticData[UCNV_NUMBER_OF_SUPPORTED_CONVERTER_TYPES];
 | 
| +U_CAPI const UConverterStaticData * ucnv_converterStaticData[UCNV_NUMBER_OF_SUPPORTED_CONVERTER_TYPES];
 | 
|  
 | 
|  /*
 | 
|   * Global - verbosity
 | 
|   */
 | 
|  UBool VERBOSE = FALSE;
 | 
| +UBool QUIET = FALSE;
 | 
|  UBool SMALL = FALSE;
 | 
|  UBool IGNORE_SISO_CHECK = FALSE;
 | 
|  
 | 
| @@ -174,6 +176,8 @@ enum {
 | 
|      OPT_VERBOSE,
 | 
|      OPT_SMALL,
 | 
|      OPT_IGNORE_SISO_CHECK,
 | 
| +    OPT_QUIET,
 | 
| +
 | 
|      OPT_COUNT
 | 
|  };
 | 
|  
 | 
| @@ -185,27 +189,19 @@ static UOption options[]={
 | 
|      UOPTION_DESTDIR,
 | 
|      UOPTION_VERBOSE,
 | 
|      { "small", NULL, NULL, NULL, '\1', UOPT_NO_ARG, 0 },
 | 
| -    { "ignore-siso-check", NULL, NULL, NULL, '\1', UOPT_NO_ARG, 0 }
 | 
| +    { "ignore-siso-check", NULL, NULL, NULL, '\1', UOPT_NO_ARG, 0 },
 | 
| +    UOPTION_QUIET,
 | 
|  };
 | 
|  
 | 
|  int main(int argc, char* argv[])
 | 
|  {
 | 
|      ConvData data;
 | 
| -    UErrorCode err = U_ZERO_ERROR, localError;
 | 
| -    char outFileName[UCNV_MAX_FULL_FILE_NAME_LENGTH];
 | 
| -    const char* destdir, *arg;
 | 
| -    size_t destdirlen;
 | 
| -    char* dot = NULL, *outBasename;
 | 
|      char cnvName[UCNV_MAX_FULL_FILE_NAME_LENGTH];
 | 
| -    char cnvNameWithPkg[UCNV_MAX_FULL_FILE_NAME_LENGTH];
 | 
| -    UVersionInfo icuVersion;
 | 
| -    UBool printFilename;
 | 
| -
 | 
| -    err = U_ZERO_ERROR;
 | 
|  
 | 
|      U_MAIN_INIT_ARGS(argc, argv);
 | 
|  
 | 
|      /* Set up the ICU version number */
 | 
| +    UVersionInfo icuVersion;
 | 
|      u_getVersion(icuVersion);
 | 
|      uprv_memcpy(&dataInfo.dataVersion, &icuVersion, sizeof(UVersionInfo));
 | 
|  
 | 
| @@ -231,7 +227,8 @@ int main(int argc, char* argv[])
 | 
|              "\t-V or --version     show a version message\n"
 | 
|              "\t-c or --copyright   include a copyright notice\n"
 | 
|              "\t-d or --destdir     destination directory, followed by the path\n"
 | 
| -            "\t-v or --verbose     Turn on verbose output\n",
 | 
| +            "\t-v or --verbose     Turn on verbose output\n"
 | 
| +            "\t-q or --quiet       do not display warnings and progress\n",
 | 
|              argv[0]);
 | 
|          fprintf(stdfile,
 | 
|              "\t      --small       Generate smaller .cnv files. They will be\n"
 | 
| @@ -251,26 +248,24 @@ int main(int argc, char* argv[])
 | 
|  
 | 
|      /* get the options values */
 | 
|      haveCopyright = options[OPT_COPYRIGHT].doesOccur;
 | 
| -    destdir = options[OPT_DESTDIR].value;
 | 
| +    const char *destdir = options[OPT_DESTDIR].value;
 | 
|      VERBOSE = options[OPT_VERBOSE].doesOccur;
 | 
| +    QUIET = options[OPT_QUIET].doesOccur;
 | 
|      SMALL = options[OPT_SMALL].doesOccur;
 | 
|  
 | 
|      if (options[OPT_IGNORE_SISO_CHECK].doesOccur) {
 | 
|          IGNORE_SISO_CHECK = TRUE;
 | 
|      }
 | 
|  
 | 
| +    icu::CharString outFileName;
 | 
| +    UErrorCode err = U_ZERO_ERROR;
 | 
|      if (destdir != NULL && *destdir != 0) {
 | 
| -        uprv_strcpy(outFileName, destdir);
 | 
| -        destdirlen = uprv_strlen(destdir);
 | 
| -        outBasename = outFileName + destdirlen;
 | 
| -        if (*(outBasename - 1) != U_FILE_SEP_CHAR) {
 | 
| -            *outBasename++ = U_FILE_SEP_CHAR;
 | 
| -            ++destdirlen;
 | 
| +        outFileName.append(destdir, err).ensureEndsWithFileSeparator(err);
 | 
| +        if (U_FAILURE(err)) {
 | 
| +            return err;
 | 
|          }
 | 
| -    } else {
 | 
| -        destdirlen = 0;
 | 
| -        outBasename = outFileName;
 | 
|      }
 | 
| +    int32_t outBasenameStart = outFileName.length();
 | 
|  
 | 
|  #if DEBUG
 | 
|      {
 | 
| @@ -284,59 +279,59 @@ int main(int argc, char* argv[])
 | 
|      }
 | 
|  #endif
 | 
|  
 | 
| -    err = U_ZERO_ERROR;
 | 
| -    printFilename = (UBool) (argc > 2 || VERBOSE);
 | 
| +    UBool printFilename = (UBool) (argc > 2 || VERBOSE);
 | 
|      for (++argv; --argc; ++argv)
 | 
|      {
 | 
| -        arg = getLongPathname(*argv);
 | 
| -
 | 
| -        /* Check for potential buffer overflow */
 | 
| -        if(strlen(arg) >= UCNV_MAX_FULL_FILE_NAME_LENGTH)
 | 
| -        {
 | 
| -            fprintf(stderr, "%s\n", u_errorName(U_BUFFER_OVERFLOW_ERROR));
 | 
| -            return U_BUFFER_OVERFLOW_ERROR;
 | 
| -        }
 | 
| +        UErrorCode localError = U_ZERO_ERROR;
 | 
| +        const char *arg = getLongPathname(*argv);
 | 
|  
 | 
|          /*produces the right destination path for display*/
 | 
| -        if (destdirlen != 0)
 | 
| +        outFileName.truncate(outBasenameStart);
 | 
| +        if (outBasenameStart != 0)
 | 
|          {
 | 
| -            const char *basename;
 | 
| -
 | 
|              /* find the last file sepator */
 | 
| -            basename = findBasename(arg);
 | 
| -            uprv_strcpy(outBasename, basename);
 | 
| +            const char *basename = findBasename(arg);
 | 
| +            outFileName.append(basename, localError);
 | 
|          }
 | 
|          else
 | 
|          {
 | 
| -            uprv_strcpy(outFileName, arg);
 | 
| +            outFileName.append(arg, localError);
 | 
| +        }
 | 
| +        if (U_FAILURE(localError)) {
 | 
| +            return localError;
 | 
|          }
 | 
|  
 | 
|          /*removes the extension if any is found*/
 | 
| -        dot = uprv_strrchr(outBasename, '.');
 | 
| -        if (dot)
 | 
| -        {
 | 
| -            *dot = '\0';
 | 
| +        int32_t lastDotIndex = outFileName.lastIndexOf('.');
 | 
| +        if (lastDotIndex >= outBasenameStart) {
 | 
| +            outFileName.truncate(lastDotIndex);
 | 
|          }
 | 
|  
 | 
|          /* the basename without extension is the converter name */
 | 
| -        uprv_strcpy(cnvName, outBasename);
 | 
| +        if ((outFileName.length() - outBasenameStart) >= UPRV_LENGTHOF(cnvName)) {
 | 
| +            fprintf(stderr, "converter name %s too long\n", outFileName.data() + outBasenameStart);
 | 
| +            return U_BUFFER_OVERFLOW_ERROR;
 | 
| +        }
 | 
| +        uprv_strcpy(cnvName, outFileName.data() + outBasenameStart);
 | 
|  
 | 
|          /*Adds the target extension*/
 | 
| -        uprv_strcat(outBasename, CONVERTER_FILE_EXTENSION);
 | 
| +        outFileName.append(CONVERTER_FILE_EXTENSION, localError);
 | 
| +        if (U_FAILURE(localError)) {
 | 
| +            return localError;
 | 
| +        }
 | 
|  
 | 
|  #if DEBUG
 | 
|          printf("makeconv: processing %s  ...\n", arg);
 | 
|          fflush(stdout);
 | 
|  #endif
 | 
| -        localError = U_ZERO_ERROR;
 | 
|          initConvData(&data);
 | 
|          createConverter(&data, arg, &localError);
 | 
|  
 | 
|          if (U_FAILURE(localError))
 | 
|          {
 | 
|              /* if an error is found, print out an error msg and keep going */
 | 
| -            fprintf(stderr, "Error creating converter for \"%s\" file for \"%s\" (%s)\n", outFileName, arg,
 | 
| -                u_errorName(localError));
 | 
| +            fprintf(stderr, "Error creating converter for \"%s\" file for \"%s\" (%s)\n",
 | 
| +                    outFileName.data(), arg, u_errorName(localError));
 | 
|              if(U_SUCCESS(err)) {
 | 
|                  err = localError;
 | 
|              }
 | 
| @@ -359,9 +354,9 @@ int main(int argc, char* argv[])
 | 
|              }
 | 
|              else
 | 
|              {
 | 
| -                p++;   /* If found separtor, don't include it in compare */
 | 
| +                p++;   /* If found separator, don't include it in compare */
 | 
|              }
 | 
| -            if(uprv_stricmp(p,data.staticData.name))
 | 
| +            if(uprv_stricmp(p,data.staticData.name) && !QUIET)
 | 
|              {
 | 
|                  fprintf(stderr, "Warning: %s%s claims to be '%s'\n",
 | 
|                      cnvName,  CONVERTER_FILE_EXTENSION,
 | 
| @@ -380,15 +375,13 @@ int main(int argc, char* argv[])
 | 
|                  }
 | 
|              }
 | 
|  
 | 
| -            uprv_strcpy(cnvNameWithPkg, cnvName);
 | 
| -
 | 
|              localError = U_ZERO_ERROR;
 | 
| -            writeConverterData(&data, cnvNameWithPkg, destdir, &localError);
 | 
| +            writeConverterData(&data, cnvName, destdir, &localError);
 | 
|  
 | 
|              if(U_FAILURE(localError))
 | 
|              {
 | 
|                  /* if an error is found, print out an error msg and keep going*/
 | 
| -                fprintf(stderr, "Error writing \"%s\" file for \"%s\" (%s)\n", outFileName, arg,
 | 
| +                fprintf(stderr, "Error writing \"%s\" file for \"%s\" (%s)\n", outFileName.data(), arg,
 | 
|                      u_errorName(localError));
 | 
|                  if(U_SUCCESS(err)) {
 | 
|                      err = localError;
 | 
| @@ -396,7 +389,7 @@ int main(int argc, char* argv[])
 | 
|              }
 | 
|              else if (printFilename)
 | 
|              {
 | 
| -                puts(outBasename);
 | 
| +                puts(outFileName.data() + outBasenameStart);
 | 
|              }
 | 
|          }
 | 
|          fflush(stdout);
 | 
| @@ -429,7 +422,6 @@ getPlatformAndCCSIDFromName(const char *name, int8_t *pPlatform, int32_t *pCCSID
 | 
|  static void
 | 
|  readHeader(ConvData *data,
 | 
|             FileStream* convFile,
 | 
| -           const char* converterName,
 | 
|             UErrorCode *pErrorCode) {
 | 
|      char line[1024];
 | 
|      char *s, *key, *value;
 | 
| @@ -577,7 +569,7 @@ readFile(ConvData *data, const char* converterName,
 | 
|          return FALSE;
 | 
|      }
 | 
|  
 | 
| -    readHeader(data, convFile, converterName, pErrorCode);
 | 
| +    readHeader(data, convFile, pErrorCode);
 | 
|      if(U_FAILURE(*pErrorCode)) {
 | 
|          return FALSE;
 | 
|      }
 | 
| 
 |