Ignore:
Timestamp:
Jul 5, 1999, 2:36:12 PM (26 years ago)
Author:
sandervl
Message:

Codepage changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/pe2lx/misc.cpp

    r97 r272  
    1 /* $Id: misc.cpp,v 1.3 1999-06-10 17:08:54 phaller Exp $ */
     1/* $Id: misc.cpp,v 1.4 1999-07-05 12:36:12 sandervl Exp $ */
    22
    33/*
     
    2525#include "misc.h"
    2626#include <versionos2.h>    /*PLF Wed  98-03-18 01:47:26*/
     27#include <uniconv.h>
    2728
     29void convertCP(int cp, char *str);
    2830
    2931//******************************************************************************
    3032//******************************************************************************
    31 char *UnicodeToAscii(int length, WCHAR *NameString)
     33char *UnicodeToAscii(int length, WCHAR *NameString, int cp)
    3234{
    3335static char asciistring[256];
     
    3941  }
    4042  asciistring[length] = 0;
     43
     44  convertCP(cp, asciistring);
    4145  return(asciistring);
     46}
     47
     48//******************************************************************************
     49//******************************************************************************
     50char *UnicodeToAscii(WCHAR *wstring, int cp)
     51{
     52 static char astring[512];
     53 int i;
     54
     55  memset(astring, 0, sizeof(astring));
     56
     57  for(i=0;i<=UniStrlen(wstring);i++) { //including 0 terminator
     58        astring[i] = (UCHAR)wstring[i];
     59  }
     60  convertCP(cp, astring);
     61  return(astring);
    4262}
    4363//******************************************************************************
     
    4969  while(wstring[i] != 0)        i++;
    5070  return(i);
    51 }
    52 //******************************************************************************
    53 //******************************************************************************
    54 char *UnicodeToAscii(WCHAR *wstring)
    55 {
    56  static char astring[512];
    57  int i;
    58 
    59   memset(astring, 0, sizeof(astring));
    60 
    61   for(i=0;i<=UniStrlen(wstring);i++) { //including 0 terminator
    62         astring[i] = (UCHAR)wstring[i];
    63   }
    64   return(astring);
    6571}
    6672//******************************************************************************
     
    7783}
    7884//******************************************************************************
     85char transCP[256];
     86int CodePage=-1;
    7987//******************************************************************************
     88BOOL prepareCP(int cp)
     89{
     90  #define SIZE_ucs_code_page 20
     91
     92  static  UconvObject uconv_objFrom = NULL;
     93  static  UconvObject uconv_objTo = NULL;
     94
     95  UniChar ucs_code_page[SIZE_ucs_code_page];
     96  int     rc, i, j;
     97  BOOL    ret;
     98  size_t  uni_chars_left;
     99  size_t  in_bytes_left;
     100  size_t  num_subs;
     101  UniChar *pout_uni_str;
     102  char    *pin_char_str;
     103  char    table[256];
     104  UniChar fromCP[256];
     105  UniChar toCP[256];
     106
     107  if(cp != 0)
     108  {
     109    if(uconv_objTo == NULL)
     110    {
     111      rc = UniCreateUconvObject( (UniChar*)L"", &uconv_objTo);
     112      if ( rc != ULS_SUCCESS )
     113      {
     114        printf("ERROR UniCreateUconvObject, return code = %u\n", rc);
     115        return FALSE;
     116      }
     117    }
     118
     119    if(cp != CodePage)
     120    {
     121      if(uconv_objFrom != NULL)
     122      {
     123        rc = UniFreeUconvObject(uconv_objFrom);
     124        if (rc != ULS_SUCCESS)
     125        {
     126          printf("ERROR UniFreeUconvObject error: return code = %u\n", rc);
     127          return FALSE;
     128        }
     129      }
     130      rc = UniMapCpToUcsCp(cp, ucs_code_page, SIZE_ucs_code_page);
     131      if (rc != ULS_SUCCESS)
     132      {
     133        printf("ERROR couldn't translate Codepage ID to unistring, return code = %u\n", rc);
     134        return FALSE;
     135      }
     136      rc = UniCreateUconvObject( ucs_code_page, &uconv_objFrom);
     137      if ( rc != ULS_SUCCESS )
     138      {
     139        printf("ERROR UniCreateUconvObject, return code = %u\n", rc);
     140        return FALSE;
     141      }
     142      for(i=0;i<256;i++)
     143        table[i] = i;
     144
     145      in_bytes_left = 256;
     146      uni_chars_left = 256;
     147      pout_uni_str = fromCP;
     148      pin_char_str = table;
     149      rc = UniUconvToUcs(uconv_objFrom, (void**)&pin_char_str, &in_bytes_left,
     150                         &pout_uni_str, &uni_chars_left, &num_subs);
     151      if ( rc != ULS_SUCCESS )
     152      {
     153        printf("ERROR UniUconvToUcs, return code = %u\n", rc);
     154        return FALSE;
     155      }
     156
     157      in_bytes_left = 256;
     158      uni_chars_left = 256;
     159      pout_uni_str = toCP;
     160      pin_char_str = table;
     161      rc = UniUconvToUcs(uconv_objTo, (void**)&pin_char_str, &in_bytes_left,
     162                         &pout_uni_str, &uni_chars_left, &num_subs);
     163      if ( rc != ULS_SUCCESS )
     164      {
     165        printf("ERROR UniUconvToUcs, return code = %u\n", rc);
     166        return FALSE;
     167      }
     168
     169      CodePage = cp;
     170
     171      for(i=0;i<256;i++)
     172      {
     173        transCP[i] = i;
     174        for(j=0;j<256;j++)
     175        {
     176          if(fromCP[i] == toCP[j])
     177          {
     178            transCP[i] = j;
     179            break;
     180          }
     181        }
     182      }
     183    }
     184  }
     185  return TRUE;
     186}
     187//******************************************************************************
     188//******************************************************************************
     189void convertCP(int cp, char *str)
     190{
     191  if(str == NULL)
     192    return;
     193
     194  if(prepareCP(cp) == TRUE && CodePage > 0)
     195    while(*str != 0)
     196      *str++ = transCP[*str];
     197}
     198//******************************************************************************
     199//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.