⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unicode.cpp

📁 我把unrar的代码整理成vc工程了
💻 CPP
字号:
#include "rar.hpp"#if defined(_EMX) && !defined(_DJGPP)#include "unios2.cpp"#endifbool WideToChar(const wchar *Src,char *Dest,int DestSize){  bool RetCode=true;#ifdef _WIN_32  if (WideCharToMultiByte(CP_ACP,0,Src,-1,Dest,DestSize,NULL,NULL)==0)    RetCode=false;#else#ifdef _APPLE  WideToUtf(Src,Dest,DestSize);#else#ifdef MBFUNCTIONS  size_t ResultingSize=wcstombs(Dest,Src,DestSize);  if (ResultingSize==(size_t)-1)    RetCode=false;  if (ResultingSize==0 && *Src!=0)    RetCode=false;  if ((!RetCode || *Dest==0 && *Src!=0) && DestSize>NM && strlenw(Src)<NM)  {    /* Workaround for strange Linux Unicode functions bug.       Some of wcstombs and mbstowcs implementations in some situations       (we are yet to find out what it depends on) can return an empty       string and success code if buffer size value is too large.    */    return(WideToChar(Src,Dest,NM));  }#else  if (UnicodeEnabled())  {#if defined(_EMX) && !defined(_DJGPP)    int len=Min(strlenw(Src)+1,DestSize-1);    if (uni_fromucs((UniChar*)Src,len,Dest,(size_t*)&DestSize)==-1 ||        DestSize>len*2)      RetCode=false;    Dest[DestSize]=0;#endif  }  else    for (int I=0;I<DestSize;I++)    {      Dest[I]=(char)Src[I];      if (Src[I]==0)        break;    }#endif#endif#endif  return(RetCode);}bool CharToWide(const char *Src,wchar *Dest,int DestSize){  bool RetCode=true;#ifdef _WIN_32  if (MultiByteToWideChar(CP_ACP,0,Src,-1,Dest,DestSize)==0)    RetCode=false;#else#ifdef _APPLE  UtfToWide(Src,Dest,DestSize);#else#ifdef MBFUNCTIONS  size_t ResultingSize=mbstowcs(Dest,Src,DestSize);  if (ResultingSize==(size_t)-1)    RetCode=false;  if (ResultingSize==0 && *Src!=0)    RetCode=false;  if ((!RetCode || *Dest==0 && *Src!=0) && DestSize>NM && strlen(Src)<NM)  {    /* Workaround for strange Linux Unicode functions bug.       Some of wcstombs and mbstowcs implementations in some situations       (we are yet to find out what it depends on) can return an empty       string and success code if buffer size value is too large.    */    return(CharToWide(Src,Dest,NM));  }#else  if (UnicodeEnabled())  {#if defined(_EMX) && !defined(_DJGPP)    int len=Min(strlen(Src)+1,DestSize-1);    if (uni_toucs((char*)Src,len,(UniChar*)Dest,(size_t*)&DestSize)==-1 ||        DestSize>len)      DestSize=0;    RetCode=false;#endif  }  else    for (int I=0;I<DestSize;I++)    {      Dest[I]=(wchar_t)Src[I];      if (Src[I]==0)        break;    }#endif#endif#endif  return(RetCode);}byte* WideToRaw(const wchar *Src,byte *Dest,int DestSize){  for (int I=0;I<DestSize;I++,Src++)  {    Dest[I*2]=(byte)*Src;    Dest[I*2+1]=(byte)(*Src>>8);    if (*Src==0)      break;  }  return(Dest);}wchar* RawToWide(const byte *Src,wchar *Dest,int DestSize){  for (int I=0;I<DestSize;I++)    if ((Dest[I]=Src[I*2]+(Src[I*2+1]<<8))==0)      break;  return(Dest);}void WideToUtf(const wchar *Src,char *Dest,int DestSize){  DestSize--;  while (*Src!=0 && --DestSize>=0)  {    uint c=*(Src++);    if (c<0x80)      *(Dest++)=c;    else      if (c<0x800 && --DestSize>=0)      {        *(Dest++)=(0xc0|(c>>6));        *(Dest++)=(0x80|(c&0x3f));      }      else        if (c<0x10000 && (DestSize-=2)>=0)        {          *(Dest++)=(0xe0|(c>>12));          *(Dest++)=(0x80|((c>>6)&0x3f));          *(Dest++)=(0x80|(c&0x3f));        }        else          if (c < 0x200000 && (DestSize-=3)>=0)          {            *(Dest++)=(0xf0|(c>>18));            *(Dest++)=(0x80|((c>>12)&0x3f));            *(Dest++)=(0x80|((c>>6)&0x3f));            *(Dest++)=(0x80|(c&0x3f));          }  }  *Dest=0;}void UtfToWide(const char *Src,wchar *Dest,int DestSize){  DestSize--;  while (*Src!=0)  {    uint c=(byte)*(Src++),d;    if (c<0x80)      d=c;    else      if ((c>>5)==6)      {        if ((*Src&0xc0)!=0x80)          break;        d=((c&0x1f)<<6)|(*Src&0x3f);        Src++;      }      else        if ((c>>4)==14)        {          if ((Src[0]&0xc0)!=0x80 || (Src[1]&0xc0)!=0x80)            break;          d=((c&0xf)<<12)|((Src[0]&0x3f)<<6)|(Src[1]&0x3f);          Src+=2;        }        else          if ((c>>3)==30)          {            if ((Src[0]&0xc0)!=0x80 || (Src[1]&0xc0)!=0x80 || (Src[2]&0xc0)!=0x80)              break;            d=((c&7)<<18)|((Src[0]&0x3f)<<12)|((Src[1]&0x3f)<<6)|(Src[2]&0x3f);            Src+=3;          }          else            break;    if (--DestSize<0)      break;    if (d>0xffff)    {      if (--DestSize<0 || d>0x10ffff)        break;      *(Dest++)=((d-0x10000)>>10)+0xd800;      *(Dest++)=(d&0x3ff)+0xdc00;    }    else      *(Dest++)=d;  }  *Dest=0;}bool UnicodeEnabled(){#ifdef UNICODE_SUPPORTED  #ifdef _EMX    return(uni_ready);  #else    return(true);  #endif#else  return(false);#endif}int strlenw(const wchar *str){  int length=0;  while (*(str++)!=0)    length++;  return(length);}wchar* strcpyw(wchar *dest,const wchar *src){  do {    *(dest++)=*src;  } while (*(src++)!=0);  return(dest);}wchar* strncpyw(wchar *dest,const wchar *src,size_t n){  do {    *(dest++)=*src;  } while (*(src++)!=0 && (int)(--n) > 0);  return(dest);}wchar* strcatw(wchar *dest,const wchar *src){  return(strcpyw(dest+strlenw(dest),src));}#ifndef SFX_MODULEwchar* strncatw(wchar *dest,const wchar *src,size_t n){  dest+=strlenw(dest);  while (true)    if ((int)(--n)<0)    {      *dest=0;      break;    }    else      if ((*(dest++)=*(src++))==0)        break;  return(dest);}#endifint strcmpw(const wchar *s1,const wchar *s2){  while (*s1==*s2)  {    if (*s1==0)      return(0);    s1++;    s2++;  }  return(*s1<*s2 ? -1:1);}int strncmpw(const wchar *s1,const wchar *s2,size_t n){  while ((int)(n--)>0)  {    if (*s1<*s2)      return(-1);    if (*s1>*s2)      return(-1);    if (*s1==0)      break;    s1++;    s2++;  }  return(0);}#ifndef SFX_MODULEint stricmpw(const wchar *s1,const wchar *s2){  char Ansi1[NM*sizeof(wchar)],Ansi2[NM*sizeof(wchar)];  WideToChar(s1,Ansi1,sizeof(Ansi1));  WideToChar(s2,Ansi2,sizeof(Ansi2));  return(stricomp(Ansi1,Ansi2));}#endif#if !defined(SFX_MODULE) && !defined(_WIN_CE)inline int strnicmpw_w2c(const wchar *s1,const wchar *s2,size_t n){  wchar Wide1[NM*2],Wide2[NM*2];  strncpyw(Wide1,s1,sizeof(Wide1)/sizeof(Wide1[0])-1);  strncpyw(Wide2,s2,sizeof(Wide2)/sizeof(Wide2[0])-1);  Wide1[Min(sizeof(Wide1)/sizeof(Wide1[0])-1,n)]=0;  Wide2[Min(sizeof(Wide2)/sizeof(Wide2[0])-1,n)]=0;  char Ansi1[NM*2],Ansi2[NM*2];  WideToChar(Wide1,Ansi1,sizeof(Ansi1));  WideToChar(Wide2,Ansi2,sizeof(Ansi2));  return(stricomp(Ansi1,Ansi2));}#endif#ifndef SFX_MODULEint strnicmpw(const wchar *s1,const wchar *s2,size_t n){  return(strnicmpw_w2c(s1,s2,n));}#endifwchar* strchrw(const wchar *s,int c){  while (*s)  {    if (*s==c)      return((wchar *)s);    s++;  }  return(NULL);}wchar* strrchrw(const wchar *s,int c){  for (int I=strlenw(s)-1;I>=0;I--)    if (s[I]==c)      return((wchar *)(s+I));  return(NULL);}wchar* strpbrkw(const wchar *s1,const wchar *s2){  while (*s1)  {    if (strchrw(s2,*s1)!=NULL)      return((wchar *)s1);    s1++;  }  return(NULL);}#ifndef SFX_MODULEwchar* strlowerw(wchar *Str){  for (wchar *ChPtr=Str;*ChPtr;ChPtr++)    if (*ChPtr<128)      *ChPtr=loctolower(*ChPtr);  return(Str);}#endif#ifndef SFX_MODULEwchar* strupperw(wchar *Str){  for (wchar *ChPtr=Str;*ChPtr;ChPtr++)    if (*ChPtr<128)      *ChPtr=loctoupper(*ChPtr);  return(Str);}#endif#ifndef SFX_MODULEwchar* strdupw(const wchar *Str){  if (Str==NULL)    return(NULL);  wchar *n=(wchar *)malloc((strlenw(Str)+1)*sizeof(wchar));  if (n==NULL)    return(NULL);  strcpyw(n,Str);  return(n);}#endif#ifndef SFX_MODULEint toupperw(int ch){  return((ch<128) ? loctoupper(ch):ch);}#endifint atoiw(const wchar *s){  int n=0;  while (*s>='0' && *s<='9')  {    n=n*10+(*s-'0');    s++;  }  return(n);}#ifdef DBCS_SUPPORTEDSupportDBCS gdbcs;SupportDBCS::SupportDBCS(){  Init();}void SupportDBCS::Init(){  CPINFO CPInfo;  GetCPInfo(CP_ACP,&CPInfo);  DBCSMode=CPInfo.MaxCharSize > 1;  for (int I=0;I<sizeof(IsLeadByte)/sizeof(IsLeadByte[0]);I++)    IsLeadByte[I]=IsDBCSLeadByte(I);}char* SupportDBCS::charnext(const char *s){  return (char *)(IsLeadByte[*s] ? s+2:s+1);}uint SupportDBCS::strlend(const char *s){  uint Length=0;  while (*s!=0)  {    if (IsLeadByte[*s])      s+=2;    else      s++;    Length++;  }  return(Length);}char* SupportDBCS::strchrd(const char *s, int c){  while (*s!=0)    if (IsLeadByte[*s])      s+=2;    else      if (*s==c)        return((char *)s);      else        s++;  return(NULL);}void SupportDBCS::copychrd(char *dest,const char *src){  dest[0]=src[0];  if (IsLeadByte[src[0]])    dest[1]=src[1];}char* SupportDBCS::strrchrd(const char *s, int c){  const char *found=NULL;  while (*s!=0)    if (IsLeadByte[*s])      s+=2;    else    {      if (*s==c)        found=s;      s++;    }  return((char *)found);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -