Ticket Change Details
Not logged in
Overview

Artifact ID: 8a0d7c72704f06cc4df73edd885cc0ec30c369c9
Ticket: d17d6e5b174bd6f8bbe8be6f851de3d721190af8
Handle file names containing brackets, interrogation mark or asterisk
User & Date: anonymous 2012-11-20 15:18:47
Changes

  1. Appended to comment:
    
    
    <hr /><i>anonymous added on 2012-11-20 15:18:47 UTC:</i><br />
    char *fossil_unicode_to_utf8(void *zUnicode){
    #ifdef _WIN32
      int nByte = 0;
      char *zUtf;
      WCHAR *wUnicode = zUnicode;
    /*
    This my have problem when zUnicode is readonly.
    And it's will modify zUnicode when sometimes we did not want to modify it.
    */
      while( *wUnicode != 0 ){
        if ( (*wUnicode > 0xF000) && (*wUnicode <= 0xF07F) ){
          *wUnicode &= 0x7F;
        }
        ++wUnicode;
      }
      nByte = WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, 0, 0, 0, 0);
      zUtf = sqlite3_malloc( nByte );
      if( zUtf==0 ){
        return 0;
      }
      WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, zUtf, nByte, 0, 0);
      return zUtf;
    #else
      return (char *)zUnicode;  /* No-op on unix */
    #endif
    }
    
    
    void *fossil_utf8_to_unicode(const char *zUtf8){
    #ifdef _WIN32
    /* nWord should be meaningful than nByte here*/
      int nByte = MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, 0, 0);
      wchar_t *zUnicode = sqlite3_malloc( nByte * 2 );
      wchar_t *wUnicode;
      if( zUnicode==0 ){
        return 0;
      }
      MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, zUnicode, nByte);
      wUnicode = zUnicode;
      while( --nByte > 0){
        if ( (*wUnicode < 32) || wcschr(L"\"*<>?|", *wUnicode) ){
          *wUnicode |= 0xF000;
        }
        ++wUnicode;
      }
    
      return zUnicode;
    #else
      return (void *)zUtf8;  /* No-op on unix */
    #endif
    }