home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / fed0217s.zip / source / cp_cvt.cpp < prev    next >
C/C++ Source or Header  |  2001-09-19  |  3KB  |  139 lines

  1. /*
  2. ** Module   :CP_CVT.CPP
  3. ** Abstract :Unicode API wrapper
  4. **
  5. ** Copyright (C) Sergey I. Yevtushenko
  6. **
  7. ** Log: Wed  15/12/1999 Created
  8. **
  9. */
  10.  
  11. //#ifdef __EMX__
  12. //#define USE_OS2_TOOLKIT_HEADERS
  13. //#include <os2.h>
  14. //#endif
  15.  
  16. #include <uconv.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19.  
  20. int cp2cp(char *cp1, char *cp2, char *src, char *dst, int len)
  21. {
  22.     UconvObject ucSrc = 0;
  23.     UconvObject ucDst = 0;
  24.  
  25.     size_t uBytes;
  26.     size_t uUniChars;
  27.     size_t uSubs;
  28.  
  29.     UniChar* pUniBuf;
  30.     UniChar* pUniPtr;
  31.  
  32.     UniChar UniCP1[64];
  33.     UniChar UniCP2[64];
  34.  
  35.     char *pStr;
  36.  
  37.     int rc = 0;
  38.  
  39.     /* Check parameters */
  40.  
  41.     if(!cp1 || !cp2 || !src || !dst || len < 0)
  42.         return -1;
  43.  
  44.     /* Convert codepage names to UniChar */
  45.  
  46.     rc = UniCreateUconvObject((UniChar *)L"", &ucSrc);
  47.  
  48.     if(rc)
  49.         return rc;
  50.  
  51.     pStr    = cp1;
  52.     uBytes  = strlen(cp1)+1;    /* convert including trailing 0 */
  53.     pUniPtr = UniCP1;
  54.     uUniChars = (sizeof(UniCP1)/sizeof(UniChar)) + 1;
  55.  
  56.     rc = UniUconvToUcs(ucSrc, (void **)&pStr, &uBytes, &pUniPtr, &uUniChars, &uSubs);
  57.  
  58.     if(rc)
  59.     {
  60.         UniFreeUconvObject(ucSrc);
  61.         return rc;
  62.     }
  63.  
  64.     pStr    = cp2;
  65.     uBytes  = strlen(cp2)+1;    /* convert including trailing 0 */
  66.     pUniPtr = UniCP2;
  67.     uUniChars = (sizeof(UniCP2)/sizeof(UniChar)) + 1;
  68.  
  69.     rc = UniUconvToUcs(ucSrc, (void **)&pStr, &uBytes, &pUniPtr, &uUniChars, &uSubs);
  70.  
  71.     /* conversion object is no more required */
  72.  
  73.     UniFreeUconvObject(ucSrc);
  74.  
  75.     if(rc)
  76.     {
  77.         return rc;
  78.     }
  79.  
  80.     /* Codepages is prepared, create conversion objects */
  81.  
  82.     rc = UniCreateUconvObject(UniCP1, &ucSrc);
  83.  
  84.     if(rc)
  85.     {
  86.         return rc;
  87.     }
  88.  
  89.     rc = UniCreateUconvObject(UniCP2, &ucDst);
  90.  
  91.     if(rc)
  92.     {
  93.         UniFreeUconvObject(ucSrc);
  94.         return rc;
  95.     }
  96.  
  97.     /* Conversion objects are created, prepare buffers */
  98.  
  99.     pStr      = src;
  100.     uBytes    = len;
  101.     uUniChars = len;
  102.  
  103.     pUniBuf = (UniChar*) malloc(uUniChars * sizeof(UniChar));
  104.  
  105.     if(!pUniBuf)
  106.     {
  107.         UniFreeUconvObject(ucSrc);
  108.         UniFreeUconvObject(ucDst);
  109.         return -2;
  110.     }
  111.  
  112.     pUniPtr = pUniBuf;
  113.  
  114.     rc = UniUconvToUcs(ucSrc, (void **)&pStr, &uBytes, &pUniPtr, &uUniChars, &uSubs);
  115.  
  116.     if(rc)
  117.     {
  118.         UniFreeUconvObject(ucSrc);
  119.         UniFreeUconvObject(ucDst);
  120.         free(pUniBuf);
  121.         return rc;
  122.     }
  123.  
  124.     pStr      = dst;
  125.     uBytes    = len;
  126.     uUniChars = len;
  127.  
  128.     pUniPtr = pUniBuf;
  129.  
  130.     rc = UniUconvFromUcs(ucDst, &pUniPtr, &uUniChars, (void **)&pStr, &uBytes, &uSubs);
  131.  
  132.     UniFreeUconvObject(ucSrc);
  133.     UniFreeUconvObject(ucDst);
  134.     free(pUniBuf);
  135.  
  136.     return rc;
  137. }
  138.  
  139.