home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / evbl0627.zip / everblue_20010627.zip / x11 / Xlib_uconv.c < prev    next >
C/C++ Source or Header  |  1999-11-02  |  4KB  |  103 lines

  1.  
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <strings.h>
  7.  
  8. #define INCL_BASE
  9. #define INCL_WIN
  10. #define INCL_GPI
  11. #define INCL_WINATOM
  12. #include <os2.h>
  13.  
  14. typedef void * UconvObject;
  15. typedef unsigned short UniChar;
  16.  
  17. #define UCSCPSIZE 16
  18. #define CALLCONV
  19. #define ISO8859_1       (UniChar *)L"IBM-819"
  20.  
  21. static UniChar ucsCodepage[UCSCPSIZE];
  22.  
  23. int CALLCONV UniMapCpToUcsCp( 
  24.              unsigned long ulCodePage, /* I  - A codepage as DosQueryCp    */
  25.              UniChar *ucsCodePage,     /* O  - Unicode name of uconv table */
  26.              size_t n );               /* I  - Output size (chars)         */
  27.  
  28. int CALLCONV UniCreateUconvObject(
  29.              UniChar     * code_set,   /* I  - Unicode name of uconv table */
  30.              UconvObject * uobj  );    /* O  - Uconv object handle         */
  31.  
  32. int CALLCONV UniFreeUconvObject(
  33.              UconvObject   uobj   );   /* I  - Uconv object handle         */
  34.  
  35. int CALLCONV UniUconvToUcs(
  36.              UconvObject uobj,         /* I  - Uconv object handle         */
  37.              void    * * inbuf,        /* IO - Input buffer                */
  38.              size_t    * inbytes,      /* IO - Input buffer size (bytes)   */
  39.              UniChar * * outbuf,       /* IO - Output buffer size          */
  40.              size_t    * outchars,     /* IO - Output size (chars)         */
  41.              size_t    * subst  );     /* IO - Substitution count          */
  42.  
  43. int CALLCONV UniUconvFromUcs(
  44.              UconvObject uobj,         /* I  - Uconv object handle         */
  45.              UniChar * * inbuf,        /* IO - Input buffer                */
  46.              size_t    * inchars,      /* IO - Input buffer size (bytes)   */
  47.              void    * * outbuf,       /* IO - Output buffer size          */
  48.              size_t    * outbytes,     /* IO - Output size (chars)         */
  49.              size_t    * subst   );    /* IO - Substitution count          */
  50.  
  51.  
  52. #ifdef OS2I18N
  53.  
  54. void Xlib_InitOS2I18N(void)
  55. {
  56.     ULONG cp[3], rc;
  57.     /*DosQueryCp(3, cp, &rc);*/
  58.     cp[0] = 1004;
  59.     UniMapCpToUcsCp(cp[0], ucsCodepage, UCSCPSIZE);
  60. }
  61.  
  62. int Xlib_XlatUCS_2(char *tgt, int tgt_size, void *src, int src_size)
  63. {
  64.     UconvObject xlat = NULL;
  65.     int result = 0;
  66.     size_t src_pos = src_size, tgt_pos = tgt_size, dup;
  67.     if (UniCreateUconvObject( ucsCodepage, &xlat ))
  68.     {
  69.         src_size *= 2;
  70.         result = (src_size>tgt_size)?tgt_size:src_size;
  71.         strncpy(tgt, (char*)src, result);
  72.     } else {
  73.         UniUconvFromUcs(xlat, (UniChar **)&src, &src_pos, (void **)&tgt, &tgt_pos, &dup);
  74.         UniFreeUconvObject(xlat);
  75.         result = tgt_size - tgt_pos;
  76.     }
  77.     return result;
  78. }
  79.  
  80. int Xlib_XlatISO8859_1(char *tgt, int tgt_size, char *src, int src_size)
  81. {
  82.     UconvObject xlat1 = NULL, xlat2 = NULL;
  83.     int result = 0;
  84.     size_t src_pos = src_size, tgt_pos = tgt_size, dup;
  85.     size_t tmpsize = src_size + 1, tmppos = tmpsize;
  86.     UniChar *tmpbuf = alloca(tmpsize * sizeof(UniChar)), *tmp = tmpbuf;
  87.     if (UniCreateUconvObject( ISO8859_1, &xlat1 ) ||
  88.         UniCreateUconvObject( ucsCodepage, &xlat2 )) 
  89.     {
  90.         result = (tgt_size>src_size)?src_size:tgt_size;
  91.         strncpy(tgt, src, result);
  92.     } else {
  93.         UniUconvToUcs(xlat1, (void **)&src, &src_pos, &tmp, &tmppos, &dup);
  94.         tmp = tmpbuf; tmppos = tmpsize - tmppos;
  95.         UniUconvFromUcs(xlat2, &tmp, &tmppos, (void **)&tgt, &tgt_pos, &dup);
  96.         result = tgt_size - tgt_pos;
  97.     }
  98.     if (xlat1) UniFreeUconvObject(xlat1);
  99.     if (xlat2) UniFreeUconvObject(xlat2);
  100.     return result;
  101. }
  102.  
  103. #endif