Changes On Branch ticket-e399bc
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch ticket-e399bc Excluding Merge-Ins

This is equivalent to a diff from 22b570f4f3 to 1002e7238c

2012-11-29
13:15
Translate decomposed-UTF8 filenames on MacOS into precomposed-UTF8. Fix for ticket [e399bc1edfe45b] check-in: ca728447a6 user: drh tags: trunk
13:12
Translate decomposed-UTF8 filenames on MacOS into precomposed-UTF8. Fix for ticket [e399bc1edfe45b] Closed-Leaf check-in: 1002e7238c user: drh tags: ticket-e399bc
09:59
One more thing I spotted (but cannot test!): UTF8-mac encoded values could enter fossil through environment variables as well... check-in: 42951c59ae user: jan.nijtmans tags: ticket-e399bc
07:56
Fix a couple line length issues and modify an error message. check-in: 3527aa4474 user: mistachkin tags: trunk
03:14
Untested changes designed to fix broken filename encodings on MacOS. Move all character-set converting routines into a new file called utf8.c. Add the fossil_filename_to_utf8() routine, which converts Unicode to utf8 on windows and decomposed utf8 into precomposed utf8 on Mac. Ticket [e399bc1edfe45b] check-in: c24e568fb0 user: drh tags: ticket-e399bc
01:45
Give the user the option to convert file into UTF8 if they are in some other encoding when committed. The commit aborts regardless, to give the operator an opportunity to retest the changes before committing again. check-in: 22b570f4f3 user: drh tags: trunk
2012-11-28
23:05
Serious bug fix: Avoid deleting the respository if the repository is in the checkout and you do a "fossil close". check-in: fcdeaa2909 user: drh tags: trunk
08:44
merge trunk Closed-Leaf check-in: 9d67e2e2d3 user: jan.nijtmans tags: convert_before_commit_v2

Changes to auto.def.

    77     77   }
    78     78   
    79     79   if {[opt-bool static]} {
    80     80       # XXX: This will not work on all systems.
    81     81       define-append EXTRA_LDFLAGS -static
    82     82   }
    83     83   
    84         -
    85     84   # Check for zlib, using the given location if specified
    86     85   set zlibpath [opt-val with-zlib]
    87     86   if {$zlibpath ne ""} {
    88     87       cc-with [list -cflags "-I$zlibpath -L$zlibpath"]
    89     88       define-append EXTRA_CFLAGS -I$zlibpath
    90     89       define-append EXTRA_LDFLAGS -L$zlibpath
    91     90   }
................................................................................
   219    218   cc-check-function-in-lib gethostbyname nsl
   220    219   if {![cc-check-function-in-lib socket {socket network}]} {
   221    220       # Last resort, may be Windows
   222    221       if {[string match *mingw* [get-define host]]} {
   223    222           define-append LIBS -lwsock32
   224    223       }
   225    224   }
          225  +cc-check-function-in-lib iconv iconv
   226    226   
   227    227   # Check for getpassphrase() for Solaris 10 where getpass() truncates to 10 chars
   228    228   if {![cc-check-functions getpassphrase]} {
   229    229       # Haiku needs this
   230    230       cc-check-function-in-lib getpass bsd
   231    231   }
   232    232   
   233    233   make-template Makefile.in
   234    234   make-config-header autoconfig.h -auto {USE_* FOSSIL_*}

Changes to src/blob.c.

  1109   1109     }else if( starts_with_utf16le_bom(pBlob, &bomSize) ){
  1110   1110       /* Make sure the blob contains two terminating 0-bytes */
  1111   1111       blob_append(pBlob, "", 1);
  1112   1112       zUtf8 = blob_str(pBlob) + bomSize;
  1113   1113       zUtf8 = fossil_unicode_to_utf8(zUtf8);
  1114   1114       blob_zero(pBlob);
  1115   1115       blob_append(pBlob, zUtf8, -1);
  1116         -    fossil_mbcs_free(zUtf8);
         1116  +    fossil_unicode_free(zUtf8);
  1117   1117     }else if( starts_with_utf16be_bom(pBlob, &bomSize) ){
  1118   1118       unsigned int i = blob_size(pBlob);
  1119   1119       zUtf8 = blob_buffer(pBlob);
  1120   1120       while( i > 0 ){
  1121   1121         /* swap bytes of unicode representation */
  1122   1122         char zTemp = zUtf8[--i];
  1123   1123         zUtf8[i] = zUtf8[i-1];
................................................................................
  1125   1125       }
  1126   1126       /* Make sure the blob contains two terminating 0-bytes */
  1127   1127       blob_append(pBlob, "", 1);
  1128   1128       zUtf8 = blob_str(pBlob) + bomSize;
  1129   1129       zUtf8 = fossil_unicode_to_utf8(zUtf8);
  1130   1130       blob_zero(pBlob);
  1131   1131       blob_append(pBlob, zUtf8, -1);
  1132         -    fossil_mbcs_free(zUtf8);
         1132  +    fossil_unicode_free(zUtf8);
  1133   1133     }else if( useMbcs ){
  1134   1134       zUtf8 = fossil_mbcs_to_utf8(blob_str(pBlob));
  1135   1135       blob_reset(pBlob);
  1136   1136       blob_append(pBlob, zUtf8, -1);
  1137   1137       fossil_mbcs_free(zUtf8);
  1138   1138   #endif /* _WIN32 */
  1139   1139     }
  1140   1140   }

Changes to src/file.c.

    73     73     }else{
    74     74       return stat(zFilename, buf);
    75     75     }
    76     76   #else
    77     77     int rc = 0;
    78     78     wchar_t *zMbcs = fossil_utf8_to_unicode(zFilename);
    79     79     rc = _wstati64(zMbcs, buf);
    80         -  fossil_mbcs_free(zMbcs);
           80  +  fossil_unicode_free(zMbcs);
    81     81     return rc;
    82     82   #endif
    83     83   }
    84     84   
    85     85   /*
    86     86   ** Fill in the fileStat variable for the file named zFilename.
    87     87   ** If zFilename==0, then use the previous value of fileStat if
................................................................................
   304    304   /*
   305    305   ** Wrapper around the access() system call.
   306    306   */
   307    307   int file_access(const char *zFilename, int flags){
   308    308   #ifdef _WIN32
   309    309     wchar_t *zMbcs = fossil_utf8_to_unicode(zFilename);
   310    310     int rc = _waccess(zMbcs, flags);
   311         -  fossil_mbcs_free(zMbcs);
          311  +  fossil_unicode_free(zMbcs);
   312    312   #else
   313    313     int rc = access(zFilename, flags);
   314    314   #endif
   315    315     return rc;
   316    316   }
   317    317   
   318    318   /*
................................................................................
   408    408     utimes(zFilename, tv);
   409    409   #else
   410    410     struct _utimbuf tb;
   411    411     wchar_t *zMbcs = fossil_utf8_to_unicode(zFilename);
   412    412     tb.actime = newMTime;
   413    413     tb.modtime = newMTime;
   414    414     _wutime(zMbcs, &tb);
   415         -  fossil_mbcs_free(zMbcs);
          415  +  fossil_unicode_free(zMbcs);
   416    416   #endif
   417    417   }
   418    418   
   419    419   /*
   420    420   ** COMMAND: test-set-mtime
   421    421   **
   422    422   ** Usage: %fossil test-set-mtime FILENAME DATE/TIME
................................................................................
   442    442   /*
   443    443   ** Delete a file.
   444    444   */
   445    445   void file_delete(const char *zFilename){
   446    446   #ifdef _WIN32
   447    447     wchar_t *z = fossil_utf8_to_unicode(zFilename);
   448    448     _wunlink(z);
   449         -  fossil_mbcs_free(z);
          449  +  fossil_unicode_free(z);
   450    450   #else
   451    451     unlink(zFilename);
   452    452   #endif
   453    453   }
   454    454   
   455    455   /*
   456    456   ** Create the directory named in the argument, if it does not already
................................................................................
   466    466       file_delete(zName);
   467    467     }
   468    468     if( rc!=1 ){
   469    469   #if defined(_WIN32)
   470    470       int rc;
   471    471       wchar_t *zMbcs = fossil_utf8_to_unicode(zName);
   472    472       rc = _wmkdir(zMbcs);
   473         -    fossil_mbcs_free(zMbcs);
          473  +    fossil_unicode_free(zMbcs);
   474    474       return rc;
   475    475   #else
   476    476       return mkdir(zName, 0755);
   477    477   #endif
   478    478     }
   479    479     return 0;
   480    480   }
................................................................................
   653    653     char *zPwdUtf8;
   654    654     int nPwd;
   655    655     int i;
   656    656     wchar_t zPwd[2000];
   657    657     if( _wgetcwd(zPwd, sizeof(zPwd)/sizeof(zPwd[0])-1)==0 ){
   658    658       fossil_fatal("cannot find the current working directory.");
   659    659     }
   660         -  zPwdUtf8 = fossil_unicode_to_utf8(zPwd);
          660  +  zPwdUtf8 = fossil_filename_to_utf8(zPwd);
   661    661     nPwd = strlen(zPwdUtf8);
   662    662     if( nPwd > nBuf-1 ){
   663    663       fossil_fatal("pwd too big: max %d\n", nBuf-1);
   664    664     }
   665    665     for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/';
   666    666     memcpy(zBuf, zPwdUtf8, nPwd+1);
   667         -  fossil_mbcs_free(zPwdUtf8);
          667  +  fossil_filename_free(zPwdUtf8);
   668    668   #else
   669    669     if( getcwd(zBuf, nBuf-1)==0 ){
   670    670       if( errno==ERANGE ){
   671    671         fossil_fatal("pwd too big: max %d\n", nBuf-1);
   672    672       }else{
   673    673         fossil_fatal("cannot find current working directory; %s",
   674    674                      strerror(errno));
................................................................................
  1010   1010     const char *zDir = ".";
  1011   1011     int cnt = 0;
  1012   1012   
  1013   1013   #if defined(_WIN32)
  1014   1014     wchar_t zTmpPath[MAX_PATH];
  1015   1015   
  1016   1016     if( GetTempPathW(MAX_PATH, zTmpPath) ){
  1017         -    azDirs[0] = fossil_unicode_to_utf8(zTmpPath);
         1017  +    azDirs[0] = fossil_filename_to_utf8(zTmpPath);
  1018   1018     }
  1019   1019   
  1020   1020     azDirs[1] = fossil_getenv("TEMP");
  1021   1021     azDirs[2] = fossil_getenv("TMP");
  1022   1022   #endif
  1023   1023   
  1024   1024   
................................................................................
  1044   1044       for(i=0; i<15; i++, j++){
  1045   1045         zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
  1046   1046       }
  1047   1047       zBuf[j] = 0;
  1048   1048     }while( file_size(zBuf)>=0 );
  1049   1049   
  1050   1050   #if defined(_WIN32)
  1051         -  fossil_mbcs_free((char *)azDirs[1]);
  1052         -  fossil_mbcs_free((char *)azDirs[2]);
         1051  +  fossil_unicode_free((char *)azDirs[1]);
         1052  +  fossil_unicode_free((char *)azDirs[2]);
  1053   1053   #endif
  1054   1054   }
  1055   1055   
  1056   1056   
  1057   1057   /*
  1058   1058   ** Return true if a file named zName exists and has identical content
  1059   1059   ** to the blob pContent.  If zName does not exist or if the content is
................................................................................
  1089   1089   # define opendir _wopendir
  1090   1090   # define readdir _wreaddir
  1091   1091   # define closedir _wclosedir
  1092   1092   #endif /* _WIN32 */
  1093   1093   
  1094   1094   #endif /* INTERFACE */
  1095   1095   
  1096         -
  1097         -
  1098         -/**************************************************************************
  1099         -** The following routines translate between MBCS and UTF8 on windows.
  1100         -** Since everything is always UTF8 on unix, these routines are no-ops
  1101         -** there.
  1102         -*/
  1103         -
  1104         -/*
  1105         -** Translate MBCS to UTF8.  Return a pointer to the translated text.
  1106         -** Call fossil_mbcs_free() to deallocate any memory used to store the
  1107         -** returned pointer when done.
  1108         -*/
  1109         -char *fossil_mbcs_to_utf8(const char *zMbcs){
  1110         -#ifdef _WIN32
  1111         -  extern char *sqlite3_win32_mbcs_to_utf8(const char*);
  1112         -  return sqlite3_win32_mbcs_to_utf8(zMbcs);
  1113         -#else
  1114         -  return (char*)zMbcs;  /* No-op on unix */
  1115         -#endif
  1116         -}
  1117         -
  1118         -/*
  1119         -** Translate Unicode to UTF8.  Return a pointer to the translated text.
  1120         -** Call fossil_mbcs_free() to deallocate any memory used to store the
  1121         -** returned pointer when done.
  1122         -*/
  1123         -char *fossil_unicode_to_utf8(const void *zUnicode){
  1124         -#ifdef _WIN32
  1125         -  int nByte = WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, 0, 0, 0, 0);
  1126         -  char *zUtf = sqlite3_malloc( nByte );
  1127         -  if( zUtf==0 ){
  1128         -    return 0;
  1129         -  }
  1130         -  WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, zUtf, nByte, 0, 0);
  1131         -  return zUtf;
  1132         -#else
  1133         -  return (char *)zUnicode;  /* No-op on unix */
  1134         -#endif
  1135         -}
  1136         -
  1137         -/*
  1138         -** Translate UTF8 to MBCS for use in system calls.  Return a pointer to the
  1139         -** translated text..  Call fossil_mbcs_free() to deallocate any memory
  1140         -** used to store the returned pointer when done.
  1141         -*/
  1142         -char *fossil_utf8_to_mbcs(const char *zUtf8){
  1143         -#ifdef _WIN32
  1144         -  extern char *sqlite3_win32_utf8_to_mbcs(const char*);
  1145         -  return sqlite3_win32_utf8_to_mbcs(zUtf8);
  1146         -#else
  1147         -  return (char*)zUtf8;  /* No-op on unix */
  1148         -#endif
  1149         -}
  1150         -
  1151         -/*
  1152         -** Translate UTF8 to unicode for use in system calls.  Return a pointer to the
  1153         -** translated text..  Call fossil_mbcs_free() to deallocate any memory
  1154         -** used to store the returned pointer when done.
  1155         -*/
  1156         -void *fossil_utf8_to_unicode(const char *zUtf8){
  1157         -#ifdef _WIN32
  1158         -  int nByte = MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, 0, 0);
  1159         -  wchar_t *zUnicode = sqlite3_malloc( nByte * 2 );
  1160         -  if( zUnicode==0 ){
  1161         -    return 0;
  1162         -  }
  1163         -  MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, zUnicode, nByte);
  1164         -  return zUnicode;
  1165         -#else
  1166         -  return (void *)zUtf8;  /* No-op on unix */
  1167         -#endif
  1168         -}
  1169         -
  1170   1096   /*
  1171   1097   ** Return the value of an environment variable as UTF8.
         1098  +** Use fossil_filename_free() to release resources.
  1172   1099   */
  1173   1100   char *fossil_getenv(const char *zName){
  1174   1101   #ifdef _WIN32
  1175   1102     wchar_t *uName = fossil_utf8_to_unicode(zName);
  1176   1103     void *zValue = _wgetenv(uName);
  1177         -  fossil_mbcs_free(uName);
  1178         -  if( zValue ) zValue = fossil_unicode_to_utf8(zValue);
         1104  +  fossil_unicode_free(uName);
  1179   1105   #else
  1180   1106     char *zValue = getenv(zName);
  1181   1107   #endif
         1108  +  if( zValue ) zValue = fossil_filename_to_utf8(zValue);
  1182   1109     return zValue;
  1183   1110   }
  1184   1111   
  1185         -/*
  1186         -** Display UTF8 on the console.  Return the number of
  1187         -** Characters written. If stdout or stderr is redirected
  1188         -** to a file, -1 is returned and nothing is written
  1189         -** to the console.
  1190         -*/
  1191         -int fossil_utf8_to_console(const char *zUtf8, int nByte, int toStdErr){
  1192         -#ifdef _WIN32
  1193         -  int nChar;
  1194         -  wchar_t *zUnicode; /* Unicode version of zUtf8 */
  1195         -  DWORD dummy;
  1196         -
  1197         -  static int istty[2] = { -1, -1 };
  1198         -  if( istty[toStdErr] == -1 ){
  1199         -    istty[toStdErr] = _isatty(toStdErr + 1) != 0;
  1200         -  }
  1201         -  if( !istty[toStdErr] ){
  1202         -    /* stdout/stderr is not a console. */
  1203         -    return -1;
  1204         -  }
  1205         -
  1206         -  nChar = MultiByteToWideChar(CP_UTF8, 0, zUtf8, nByte, NULL, 0);
  1207         -  zUnicode = malloc( (nChar + 1) *sizeof(zUnicode[0]) );
  1208         -  if( zUnicode==0 ){
  1209         -    return 0;
  1210         -  }
  1211         -  nChar = MultiByteToWideChar(CP_UTF8, 0, zUtf8, nByte, zUnicode, nChar);
  1212         -  if( nChar==0 ){
  1213         -    free(zUnicode);
  1214         -    return 0;
  1215         -  }
  1216         -  zUnicode[nChar] = '\0';
  1217         -  WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE - toStdErr), zUnicode, nChar, &dummy, 0);
  1218         -  return nChar;
  1219         -#else
  1220         -  return -1;  /* No-op on unix */
  1221         -#endif
  1222         -}
  1223         -
  1224         -/*
  1225         -** Translate MBCS to UTF8.  Return a pointer.  Call fossil_mbcs_free()
  1226         -** to deallocate any memory used to store the returned pointer when done.
  1227         -*/
  1228         -void fossil_mbcs_free(void *zOld){
  1229         -#ifdef _WIN32
  1230         -  extern void sqlite3_free(void*);
  1231         -  sqlite3_free(zOld);
  1232         -#else
  1233         -  /* No-op on unix */
  1234         -#endif
  1235         -}
  1236         -
  1237   1112   /*
  1238   1113   ** Like fopen() but always takes a UTF8 argument.
  1239   1114   */
  1240   1115   FILE *fossil_fopen(const char *zName, const char *zMode){
  1241   1116   #ifdef _WIN32
  1242   1117     wchar_t *uMode = fossil_utf8_to_unicode(zMode);
  1243   1118     wchar_t *uName = fossil_utf8_to_unicode(zName);
  1244   1119     FILE *f = _wfopen(uName, uMode);
  1245         -  fossil_mbcs_free(uName);
  1246         -  fossil_mbcs_free(uMode);
         1120  +  fossil_unicode_free(uName);
         1121  +  fossil_unicode_free(uMode);
  1247   1122   #else
  1248   1123     FILE *f = fopen(zName, zMode);
  1249   1124   #endif
  1250   1125     return f;
  1251   1126   }

Changes to src/main.c.

   489    489   #endif
   490    490   
   491    491     g.argc = argc;
   492    492     g.argv = argv;
   493    493   #if defined(_WIN32) && !defined(__MINGW32__)
   494    494     parse_windows_command_line(&g.argc, &g.argv);
   495    495     GetModuleFileNameW(NULL, buf, MAX_PATH);
   496         -  g.nameOfExe = fossil_unicode_to_utf8(buf);
   497         -  for(i=0; i<g.argc; i++) g.argv[i] = fossil_unicode_to_utf8(g.argv[i]);
          496  +  g.nameOfExe = fossil_filename_to_utf8(buf);
   498    497   #else
   499    498     g.nameOfExe = g.argv[0];
   500    499   #endif
          500  +  for(i=0; i<g.argc; i++) g.argv[i] = fossil_filename_to_utf8(g.argv[i]);
   501    501     for(i=1; i<g.argc-1; i++){
   502    502       z = g.argv[i];
   503    503       if( z[0]!='-' ) continue;
   504    504       z++;
   505    505       if( z[0]=='-' ) z++;
   506    506       if( z[0]==0 ) return;   /* Stop searching at "--" */
   507    507       if( fossil_strcmp(z, "args")==0 ) break;
................................................................................
   856    856     WCHAR *zUnicode = fossil_utf8_to_unicode(zNewCmd);
   857    857     if( g.fSystemTrace ) {
   858    858       char *zOut = mprintf("SYSTEM: %s\n", zNewCmd);
   859    859       fossil_puts(zOut, 1);
   860    860       fossil_free(zOut);
   861    861     }
   862    862     rc = _wsystem(zUnicode);
   863         -  fossil_mbcs_free(zUnicode);
          863  +  fossil_unicode_free(zUnicode);
   864    864     free(zNewCmd);
   865    865   #else
   866    866     /* On unix, evaluate the command directly.
   867    867     */
   868    868     if( g.fSystemTrace ) fprintf(stderr, "SYSTEM: %s\n", zOrigCmd);
   869    869     rc = system(zOrigCmd);
   870    870   #endif
................................................................................
  2020   2020                         zStopperFile, zNotFound, flags);
  2021   2021     }
  2022   2022   #endif
  2023   2023   }
  2024   2024   
  2025   2025   /*
  2026   2026   ** COMMAND:  test-echo
         2027  +**
         2028  +** Usage:  %fossil test-echo [--hex] ARGS...
  2027   2029   **
  2028   2030   ** Echo all command-line arguments (enclosed in [...]) to the screen so that
  2029   2031   ** wildcard expansion behavior of the host shell can be investigated.
         2032  +**
         2033  +** With the --hex option, show the output as hexadecimal.  This can be used
         2034  +** to verify the fossil_filename_to_utf8() routine on Windows and Mac.
  2030   2035   */
  2031   2036   void test_echo_cmd(void){
  2032         -  int i;
  2033         -  for(i=0; i<g.argc; i++){
  2034         -    fossil_print("argv[%d] = [%s]\n", i, g.argv[i]);
         2037  +  int i, j;
         2038  +  if( find_option("hex",0,0)==0 ){
         2039  +    for(i=0; i<g.argc; i++){
         2040  +      fossil_print("argv[%d] = [%s]\n", i, g.argv[i]);
         2041  +    }
         2042  +  }else{
         2043  +    unsigned char *z, c;
         2044  +    for(i=0; i<g.argc; i++){
         2045  +      fossil_print("argv[%d] = [", i);
         2046  +      z = (unsigned char*)g.argv[i];
         2047  +      for(j=0; (c = z[j])!=0; j++){
         2048  +        fossil_print("%02x", c);
         2049  +      }
         2050  +      fossil_print("]\n");
         2051  +    }
  2035   2052     }
  2036   2053   }

Changes to src/main.mk.

   100    100     $(SRCDIR)/timeline.c \
   101    101     $(SRCDIR)/tkt.c \
   102    102     $(SRCDIR)/tktsetup.c \
   103    103     $(SRCDIR)/undo.c \
   104    104     $(SRCDIR)/update.c \
   105    105     $(SRCDIR)/url.c \
   106    106     $(SRCDIR)/user.c \
          107  +  $(SRCDIR)/utf8.c \
   107    108     $(SRCDIR)/verify.c \
   108    109     $(SRCDIR)/vfile.c \
   109    110     $(SRCDIR)/wiki.c \
   110    111     $(SRCDIR)/wikiformat.c \
   111    112     $(SRCDIR)/winhttp.c \
   112    113     $(SRCDIR)/wysiwyg.c \
   113    114     $(SRCDIR)/xfer.c \
................................................................................
   201    202     $(OBJDIR)/timeline_.c \
   202    203     $(OBJDIR)/tkt_.c \
   203    204     $(OBJDIR)/tktsetup_.c \
   204    205     $(OBJDIR)/undo_.c \
   205    206     $(OBJDIR)/update_.c \
   206    207     $(OBJDIR)/url_.c \
   207    208     $(OBJDIR)/user_.c \
          209  +  $(OBJDIR)/utf8_.c \
   208    210     $(OBJDIR)/verify_.c \
   209    211     $(OBJDIR)/vfile_.c \
   210    212     $(OBJDIR)/wiki_.c \
   211    213     $(OBJDIR)/wikiformat_.c \
   212    214     $(OBJDIR)/winhttp_.c \
   213    215     $(OBJDIR)/wysiwyg_.c \
   214    216     $(OBJDIR)/xfer_.c \
................................................................................
   302    304    $(OBJDIR)/timeline.o \
   303    305    $(OBJDIR)/tkt.o \
   304    306    $(OBJDIR)/tktsetup.o \
   305    307    $(OBJDIR)/undo.o \
   306    308    $(OBJDIR)/update.o \
   307    309    $(OBJDIR)/url.o \
   308    310    $(OBJDIR)/user.o \
          311  + $(OBJDIR)/utf8.o \
   309    312    $(OBJDIR)/verify.o \
   310    313    $(OBJDIR)/vfile.o \
   311    314    $(OBJDIR)/wiki.o \
   312    315    $(OBJDIR)/wikiformat.o \
   313    316    $(OBJDIR)/winhttp.o \
   314    317    $(OBJDIR)/wysiwyg.o \
   315    318    $(OBJDIR)/xfer.o \
................................................................................
   379    382   clean:	
   380    383   	rm -rf $(OBJDIR)/* $(APPNAME)
   381    384   
   382    385   
   383    386   $(OBJDIR)/page_index.h: $(TRANS_SRC) $(OBJDIR)/mkindex
   384    387   	$(OBJDIR)/mkindex $(TRANS_SRC) >$@
   385    388   $(OBJDIR)/headers:	$(OBJDIR)/page_index.h $(OBJDIR)/makeheaders $(OBJDIR)/VERSION.h
   386         -	$(OBJDIR)/makeheaders  $(OBJDIR)/add_.c:$(OBJDIR)/add.h $(OBJDIR)/allrepo_.c:$(OBJDIR)/allrepo.h $(OBJDIR)/attach_.c:$(OBJDIR)/attach.h $(OBJDIR)/bag_.c:$(OBJDIR)/bag.h $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h $(OBJDIR)/clearsign_.c:$(OBJDIR)/clearsign.h $(OBJDIR)/clone_.c:$(OBJDIR)/clone.h $(OBJDIR)/comformat_.c:$(OBJDIR)/comformat.h $(OBJDIR)/configure_.c:$(OBJDIR)/configure.h $(OBJDIR)/content_.c:$(OBJDIR)/content.h $(OBJDIR)/db_.c:$(OBJDIR)/db.h $(OBJDIR)/delta_.c:$(OBJDIR)/delta.h $(OBJDIR)/deltacmd_.c:$(OBJDIR)/deltacmd.h $(OBJDIR)/descendants_.c:$(OBJDIR)/descendants.h $(OBJDIR)/diff_.c:$(OBJDIR)/diff.h $(OBJDIR)/diffcmd_.c:$(OBJDIR)/diffcmd.h $(OBJDIR)/doc_.c:$(OBJDIR)/doc.h $(OBJDIR)/encode_.c:$(OBJDIR)/encode.h $(OBJDIR)/event_.c:$(OBJDIR)/event.h $(OBJDIR)/export_.c:$(OBJDIR)/export.h $(OBJDIR)/file_.c:$(OBJDIR)/file.h $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h $(OBJDIR)/glob_.c:$(OBJDIR)/glob.h $(OBJDIR)/graph_.c:$(OBJDIR)/graph.h $(OBJDIR)/gzip_.c:$(OBJDIR)/gzip.h $(OBJDIR)/http_.c:$(OBJDIR)/http.h $(OBJDIR)/http_socket_.c:$(OBJDIR)/http_socket.h $(OBJDIR)/http_ssl_.c:$(OBJDIR)/http_ssl.h $(OBJDIR)/http_transport_.c:$(OBJDIR)/http_transport.h $(OBJDIR)/import_.c:$(OBJDIR)/import.h $(OBJDIR)/info_.c:$(OBJDIR)/info.h $(OBJDIR)/json_.c:$(OBJDIR)/json.h $(OBJDIR)/json_artifact_.c:$(OBJDIR)/json_artifact.h $(OBJDIR)/json_branch_.c:$(OBJDIR)/json_branch.h $(OBJDIR)/json_config_.c:$(OBJDIR)/json_config.h $(OBJDIR)/json_diff_.c:$(OBJDIR)/json_diff.h $(OBJDIR)/json_dir_.c:$(OBJDIR)/json_dir.h $(OBJDIR)/json_finfo_.c:$(OBJDIR)/json_finfo.h $(OBJDIR)/json_login_.c:$(OBJDIR)/json_login.h $(OBJDIR)/json_query_.c:$(OBJDIR)/json_query.h $(OBJDIR)/json_report_.c:$(OBJDIR)/json_report.h $(OBJDIR)/json_tag_.c:$(OBJDIR)/json_tag.h $(OBJDIR)/json_timeline_.c:$(OBJDIR)/json_timeline.h $(OBJDIR)/json_user_.c:$(OBJDIR)/json_user.h $(OBJDIR)/json_wiki_.c:$(OBJDIR)/json_wiki.h $(OBJDIR)/leaf_.c:$(OBJDIR)/leaf.h $(OBJDIR)/login_.c:$(OBJDIR)/login.h $(OBJDIR)/main_.c:$(OBJDIR)/main.h $(OBJDIR)/manifest_.c:$(OBJDIR)/manifest.h $(OBJDIR)/md5_.c:$(OBJDIR)/md5.h $(OBJDIR)/merge_.c:$(OBJDIR)/merge.h $(OBJDIR)/merge3_.c:$(OBJDIR)/merge3.h $(OBJDIR)/moderate_.c:$(OBJDIR)/moderate.h $(OBJDIR)/name_.c:$(OBJDIR)/name.h $(OBJDIR)/path_.c:$(OBJDIR)/path.h $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h $(OBJDIR)/report_.c:$(OBJDIR)/report.h $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h $(OBJDIR)/search_.c:$(OBJDIR)/search.h $(OBJDIR)/setup_.c:$(OBJDIR)/setup.h $(OBJDIR)/sha1_.c:$(OBJDIR)/sha1.h $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h $(OBJDIR)/style_.c:$(OBJDIR)/style.h $(OBJDIR)/sync_.c:$(OBJDIR)/sync.h $(OBJDIR)/tag_.c:$(OBJDIR)/tag.h $(OBJDIR)/tar_.c:$(OBJDIR)/tar.h $(OBJDIR)/th_main_.c:$(OBJDIR)/th_main.h $(OBJDIR)/timeline_.c:$(OBJDIR)/timeline.h $(OBJDIR)/tkt_.c:$(OBJDIR)/tkt.h $(OBJDIR)/tktsetup_.c:$(OBJDIR)/tktsetup.h $(OBJDIR)/undo_.c:$(OBJDIR)/undo.h $(OBJDIR)/update_.c:$(OBJDIR)/update.h $(OBJDIR)/url_.c:$(OBJDIR)/url.h $(OBJDIR)/user_.c:$(OBJDIR)/user.h $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h $(OBJDIR)/wysiwyg_.c:$(OBJDIR)/wysiwyg.h $(OBJDIR)/xfer_.c:$(OBJDIR)/xfer.h $(OBJDIR)/xfersetup_.c:$(OBJDIR)/xfersetup.h $(OBJDIR)/zip_.c:$(OBJDIR)/zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h $(OBJDIR)/VERSION.h
          389  +	$(OBJDIR)/makeheaders  $(OBJDIR)/add_.c:$(OBJDIR)/add.h $(OBJDIR)/allrepo_.c:$(OBJDIR)/allrepo.h $(OBJDIR)/attach_.c:$(OBJDIR)/attach.h $(OBJDIR)/bag_.c:$(OBJDIR)/bag.h $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h $(OBJDIR)/clearsign_.c:$(OBJDIR)/clearsign.h $(OBJDIR)/clone_.c:$(OBJDIR)/clone.h $(OBJDIR)/comformat_.c:$(OBJDIR)/comformat.h $(OBJDIR)/configure_.c:$(OBJDIR)/configure.h $(OBJDIR)/content_.c:$(OBJDIR)/content.h $(OBJDIR)/db_.c:$(OBJDIR)/db.h $(OBJDIR)/delta_.c:$(OBJDIR)/delta.h $(OBJDIR)/deltacmd_.c:$(OBJDIR)/deltacmd.h $(OBJDIR)/descendants_.c:$(OBJDIR)/descendants.h $(OBJDIR)/diff_.c:$(OBJDIR)/diff.h $(OBJDIR)/diffcmd_.c:$(OBJDIR)/diffcmd.h $(OBJDIR)/doc_.c:$(OBJDIR)/doc.h $(OBJDIR)/encode_.c:$(OBJDIR)/encode.h $(OBJDIR)/event_.c:$(OBJDIR)/event.h $(OBJDIR)/export_.c:$(OBJDIR)/export.h $(OBJDIR)/file_.c:$(OBJDIR)/file.h $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h $(OBJDIR)/glob_.c:$(OBJDIR)/glob.h $(OBJDIR)/graph_.c:$(OBJDIR)/graph.h $(OBJDIR)/gzip_.c:$(OBJDIR)/gzip.h $(OBJDIR)/http_.c:$(OBJDIR)/http.h $(OBJDIR)/http_socket_.c:$(OBJDIR)/http_socket.h $(OBJDIR)/http_ssl_.c:$(OBJDIR)/http_ssl.h $(OBJDIR)/http_transport_.c:$(OBJDIR)/http_transport.h $(OBJDIR)/import_.c:$(OBJDIR)/import.h $(OBJDIR)/info_.c:$(OBJDIR)/info.h $(OBJDIR)/json_.c:$(OBJDIR)/json.h $(OBJDIR)/json_artifact_.c:$(OBJDIR)/json_artifact.h $(OBJDIR)/json_branch_.c:$(OBJDIR)/json_branch.h $(OBJDIR)/json_config_.c:$(OBJDIR)/json_config.h $(OBJDIR)/json_diff_.c:$(OBJDIR)/json_diff.h $(OBJDIR)/json_dir_.c:$(OBJDIR)/json_dir.h $(OBJDIR)/json_finfo_.c:$(OBJDIR)/json_finfo.h $(OBJDIR)/json_login_.c:$(OBJDIR)/json_login.h $(OBJDIR)/json_query_.c:$(OBJDIR)/json_query.h $(OBJDIR)/json_report_.c:$(OBJDIR)/json_report.h $(OBJDIR)/json_tag_.c:$(OBJDIR)/json_tag.h $(OBJDIR)/json_timeline_.c:$(OBJDIR)/json_timeline.h $(OBJDIR)/json_user_.c:$(OBJDIR)/json_user.h $(OBJDIR)/json_wiki_.c:$(OBJDIR)/json_wiki.h $(OBJDIR)/leaf_.c:$(OBJDIR)/leaf.h $(OBJDIR)/login_.c:$(OBJDIR)/login.h $(OBJDIR)/main_.c:$(OBJDIR)/main.h $(OBJDIR)/manifest_.c:$(OBJDIR)/manifest.h $(OBJDIR)/md5_.c:$(OBJDIR)/md5.h $(OBJDIR)/merge_.c:$(OBJDIR)/merge.h $(OBJDIR)/merge3_.c:$(OBJDIR)/merge3.h $(OBJDIR)/moderate_.c:$(OBJDIR)/moderate.h $(OBJDIR)/name_.c:$(OBJDIR)/name.h $(OBJDIR)/path_.c:$(OBJDIR)/path.h $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h $(OBJDIR)/report_.c:$(OBJDIR)/report.h $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h $(OBJDIR)/search_.c:$(OBJDIR)/search.h $(OBJDIR)/setup_.c:$(OBJDIR)/setup.h $(OBJDIR)/sha1_.c:$(OBJDIR)/sha1.h $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h $(OBJDIR)/style_.c:$(OBJDIR)/style.h $(OBJDIR)/sync_.c:$(OBJDIR)/sync.h $(OBJDIR)/tag_.c:$(OBJDIR)/tag.h $(OBJDIR)/tar_.c:$(OBJDIR)/tar.h $(OBJDIR)/th_main_.c:$(OBJDIR)/th_main.h $(OBJDIR)/timeline_.c:$(OBJDIR)/timeline.h $(OBJDIR)/tkt_.c:$(OBJDIR)/tkt.h $(OBJDIR)/tktsetup_.c:$(OBJDIR)/tktsetup.h $(OBJDIR)/undo_.c:$(OBJDIR)/undo.h $(OBJDIR)/update_.c:$(OBJDIR)/update.h $(OBJDIR)/url_.c:$(OBJDIR)/url.h $(OBJDIR)/user_.c:$(OBJDIR)/user.h $(OBJDIR)/utf8_.c:$(OBJDIR)/utf8.h $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h $(OBJDIR)/wysiwyg_.c:$(OBJDIR)/wysiwyg.h $(OBJDIR)/xfer_.c:$(OBJDIR)/xfer.h $(OBJDIR)/xfersetup_.c:$(OBJDIR)/xfersetup.h $(OBJDIR)/zip_.c:$(OBJDIR)/zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h $(OBJDIR)/VERSION.h
   387    390   	touch $(OBJDIR)/headers
   388    391   $(OBJDIR)/headers: Makefile
   389    392   $(OBJDIR)/json.o $(OBJDIR)/json_artifact.o $(OBJDIR)/json_branch.o $(OBJDIR)/json_config.o $(OBJDIR)/json_diff.o $(OBJDIR)/json_dir.o $(OBJDIR)/json_finfo.o $(OBJDIR)/json_login.o $(OBJDIR)/json_query.o $(OBJDIR)/json_report.o $(OBJDIR)/json_tag.o $(OBJDIR)/json_timeline.o $(OBJDIR)/json_user.o $(OBJDIR)/json_wiki.o : $(SRCDIR)/json_detail.h
   390    393   Makefile:
   391    394   $(OBJDIR)/add_.c:	$(SRCDIR)/add.c $(OBJDIR)/translate
   392    395   	$(OBJDIR)/translate $(SRCDIR)/add.c >$(OBJDIR)/add_.c
   393    396   
................................................................................
  1014   1017   $(OBJDIR)/user_.c:	$(SRCDIR)/user.c $(OBJDIR)/translate
  1015   1018   	$(OBJDIR)/translate $(SRCDIR)/user.c >$(OBJDIR)/user_.c
  1016   1019   
  1017   1020   $(OBJDIR)/user.o:	$(OBJDIR)/user_.c $(OBJDIR)/user.h  $(SRCDIR)/config.h
  1018   1021   	$(XTCC) -o $(OBJDIR)/user.o -c $(OBJDIR)/user_.c
  1019   1022   
  1020   1023   $(OBJDIR)/user.h:	$(OBJDIR)/headers
         1024  +$(OBJDIR)/utf8_.c:	$(SRCDIR)/utf8.c $(OBJDIR)/translate
         1025  +	$(OBJDIR)/translate $(SRCDIR)/utf8.c >$(OBJDIR)/utf8_.c
         1026  +
         1027  +$(OBJDIR)/utf8.o:	$(OBJDIR)/utf8_.c $(OBJDIR)/utf8.h  $(SRCDIR)/config.h
         1028  +	$(XTCC) -o $(OBJDIR)/utf8.o -c $(OBJDIR)/utf8_.c
         1029  +
         1030  +$(OBJDIR)/utf8.h:	$(OBJDIR)/headers
  1021   1031   $(OBJDIR)/verify_.c:	$(SRCDIR)/verify.c $(OBJDIR)/translate
  1022   1032   	$(OBJDIR)/translate $(SRCDIR)/verify.c >$(OBJDIR)/verify_.c
  1023   1033   
  1024   1034   $(OBJDIR)/verify.o:	$(OBJDIR)/verify_.c $(OBJDIR)/verify.h  $(SRCDIR)/config.h
  1025   1035   	$(XTCC) -o $(OBJDIR)/verify.o -c $(OBJDIR)/verify_.c
  1026   1036   
  1027   1037   $(OBJDIR)/verify.h:	$(OBJDIR)/headers

Changes to src/makemake.tcl.

   105    105     tktsetup
   106    106     undo
   107    107     update
   108    108     url
   109    109     user
   110    110     verify
   111    111     vfile
          112  +  utf8
   112    113     wiki
   113    114     wikiformat
   114    115     winhttp
   115    116     wysiwyg
   116    117     xfer
   117    118     xfersetup
   118    119     zip

Changes to src/rebuild.c.

   841    841       while( (pEntry=readdir(d))!=0 ){
   842    842         Blob path;
   843    843         char *zSubpath;
   844    844   
   845    845         if( pEntry->d_name[0]=='.' ){
   846    846           continue;
   847    847         }
   848         -      zUtf8Name = fossil_unicode_to_utf8(pEntry->d_name);
          848  +      zUtf8Name = fossil_filename_to_utf8(pEntry->d_name);
   849    849         zSubpath = mprintf("%s/%s", zPath, zUtf8Name);
   850         -      fossil_mbcs_free(zUtf8Name);
          850  +      fossil_filename_free(zUtf8Name);
   851    851         if( file_isdir(zSubpath)==1 ){
   852    852           recon_read_dir(zSubpath);
   853    853         }
   854    854         blob_init(&path, 0, 0);
   855    855         blob_appendf(&path, "%s", zSubpath);
   856    856         if( blob_read_from_file(&aContent, blob_str(&path))==-1 ){
   857    857           fossil_panic("some unknown error occurred while reading \"%s\"", 
................................................................................
   865    865         fflush(stdout);
   866    866       }
   867    867       closedir(d);
   868    868     }else {
   869    869       fossil_panic("encountered error %d while trying to open \"%s\".",
   870    870                     errno, g.argv[3]);
   871    871     }
   872         -  fossil_mbcs_free(zUnicodePath);
          872  +  fossil_unicode_free(zUnicodePath);
   873    873   }
   874    874   
   875    875   /*
   876    876   ** COMMAND: reconstruct*
   877    877   **
   878    878   ** Usage: %fossil reconstruct FILENAME DIRECTORY
   879    879   **

Added src/utf8.c.

            1  +/*
            2  +** Copyright (c) 2012 D. Richard Hipp
            3  +**
            4  +** This program is free software; you can redistribute it and/or
            5  +** modify it under the terms of the Simplified BSD License (also
            6  +** known as the "2-Clause License" or "FreeBSD License".)
            7  +
            8  +** This program is distributed in the hope that it will be useful,
            9  +** but without any warranty; without even the implied warranty of
           10  +** merchantability or fitness for a particular purpose.
           11  +**
           12  +** Author contact information:
           13  +**   drh@hwaci.com
           14  +**   http://www.hwaci.com/drh/
           15  +**
           16  +*******************************************************************************
           17  +**
           18  +** This file contains utilities for converting text between UTF-8 (which
           19  +** is always used internally) and whatever encodings are used by the underlying
           20  +** filesystem and operating system.
           21  +*/
           22  +#include "config.h"
           23  +#include "utf8.h"
           24  +#include <sqlite3.h>
           25  +#ifdef _WIN32
           26  +# include <windows.h>
           27  +#endif
           28  +
           29  +/*
           30  +** Translate MBCS to UTF8.  Return a pointer to the translated text.
           31  +** Call fossil_mbcs_free() to deallocate any memory used to store the
           32  +** returned pointer when done.
           33  +*/
           34  +char *fossil_mbcs_to_utf8(const char *zMbcs){
           35  +#ifdef _WIN32
           36  +  extern char *sqlite3_win32_mbcs_to_utf8(const char*);
           37  +  return sqlite3_win32_mbcs_to_utf8(zMbcs);
           38  +#else
           39  +  return (char*)zMbcs;  /* No-op on unix */
           40  +#endif
           41  +}
           42  +
           43  +/*
           44  +** After translating from UTF8 to MBCS, invoke this routine to deallocate
           45  +** any memory used to hold the translation
           46  +*/
           47  +void fossil_mbcs_free(char *zOld){
           48  +#ifdef _WIN32
           49  +  sqlite3_free(zOld);
           50  +#else
           51  +  /* No-op on unix */
           52  +#endif
           53  +}
           54  +
           55  +/*
           56  +** Translate Unicode text into UTF8.
           57  +** Return a pointer to the translated text.
           58  +** Call fossil_unicode_free() to deallocate any memory used to store the
           59  +** returned pointer when done.
           60  +*/
           61  +char *fossil_unicode_to_utf8(const char *zUnicode){
           62  +#ifdef _WIN32
           63  +  int nByte = WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, 0, 0, 0, 0);
           64  +  char *zUtf = sqlite3_malloc( nByte );
           65  +  if( zUtf==0 ){
           66  +    return 0;
           67  +  }
           68  +  WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, zUtf, nByte, 0, 0);
           69  +  return zUtf;
           70  +#else
           71  +  return (char *)zUnicode;  /* No-op on unix */
           72  +#endif
           73  +}
           74  +
           75  +/*
           76  +** Translate UTF8 to unicode for use in system calls.  Return a pointer to the
           77  +** translated text..  Call fossil_unicode_free() to deallocate any memory
           78  +** used to store the returned pointer when done.
           79  +*/
           80  +void *fossil_utf8_to_unicode(const char *zUtf8){
           81  +#ifdef _WIN32
           82  +  int nByte = MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, 0, 0);
           83  +  wchar_t *zUnicode = sqlite3_malloc( nByte * 2 );
           84  +  if( zUnicode==0 ){
           85  +    return 0;
           86  +  }
           87  +  MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, zUnicode, nByte);
           88  +  return zUnicode;
           89  +#else
           90  +  return (void *)zUtf8;  /* No-op on unix */
           91  +#endif
           92  +}
           93  +
           94  +/*
           95  +** Deallocate any memory that was previously allocated by
           96  +** fossil_unicode_to_utf8().
           97  +*/
           98  +void fossil_unicode_free(void *pOld){
           99  +#ifdef _WIN32
          100  +  sqlite3_free(pOld);
          101  +#else
          102  +  /* No-op on unix */
          103  +#endif
          104  +}
          105  +
          106  +#if defined(__APPLE__)
          107  +# include <iconv.h>
          108  +#endif
          109  +
          110  +/*
          111  +** Translate text from the filename character set into
          112  +** to precomposed UTF8.  Return a pointer to the translated text.
          113  +** Call fossil_filename_free() to deallocate any memory used to store the
          114  +** returned pointer when done.
          115  +*/
          116  +char *fossil_filename_to_utf8(const char *zFilename){
          117  +#if defined(_WIN32)
          118  +  int nByte = WideCharToMultiByte(CP_UTF8, 0, zFilename, -1, 0, 0, 0, 0);
          119  +  char *zUtf = sqlite3_malloc( nByte );
          120  +  if( zUtf==0 ){
          121  +    return 0;
          122  +  }
          123  +  WideCharToMultiByte(CP_UTF8, 0, zFilename, -1, zUtf, nByte, 0, 0);
          124  +  return zUtf;
          125  +#elif defined(__APPLE__)
          126  +  char *zOut;
          127  +  iconv_t cd;
          128  +  size_t n, x;
          129  +  for(n=0; zFilename[n]>0 && zFilename[n]<=0x7f; n++){}
          130  +  if( zFilename[n]!=0 && (cd = iconv_open("UTF-8", "UTF-8-MAC"))!=(iconv_t)-1 ){
          131  +    char *zIn = (char*)zFilename;
          132  +    char *zOutx;
          133  +    size_t nIn, nOutx;
          134  +    nIn = n = strlen(zFilename);
          135  +    nOutx = nIn+100;
          136  +    zOutx = zOut = fossil_malloc( nOutx+1 );
          137  +    x = iconv(cd, &zIn, &nIn, &zOutx, &nOutx);
          138  +    if( x==(size_t)-1 ){
          139  +      fossil_free(zOut);
          140  +      zOut = fossil_strdup(zFilename);
          141  +    }else{
          142  +      zOut[n+100-nOutx] = 0;
          143  +    }
          144  +    iconv_close(cd);
          145  +  }else{
          146  +    zOut = fossil_strdup(zFilename);
          147  +  }
          148  +  return zOut;
          149  +#else
          150  +  return (char *)zFilename;  /* No-op on non-mac unix */
          151  +#endif
          152  +}
          153  +
          154  +/*
          155  +** Deallocate any memory that was previously allocated by
          156  +** fossil_filename_to_utf8().
          157  +*/
          158  +void fossil_filename_free(char *pOld){
          159  +#if defined(_WIN32)
          160  +  sqlite3_free(pOld);
          161  +#elif defined(__APPLE__)
          162  +  fossil_free(pOld);
          163  +#else
          164  +  /* No-op on all other unix */
          165  +#endif
          166  +}
          167  +
          168  +/*
          169  +** Display UTF8 on the console.  Return the number of
          170  +** Characters written. If stdout or stderr is redirected
          171  +** to a file, -1 is returned and nothing is written
          172  +** to the console.
          173  +*/
          174  +int fossil_utf8_to_console(const char *zUtf8, int nByte, int toStdErr){
          175  +#ifdef _WIN32
          176  +  int nChar;
          177  +  wchar_t *zUnicode; /* Unicode version of zUtf8 */
          178  +  DWORD dummy;
          179  +
          180  +  static int istty[2] = { -1, -1 };
          181  +  if( istty[toStdErr] == -1 ){
          182  +    istty[toStdErr] = _isatty(toStdErr + 1) != 0;
          183  +  }
          184  +  if( !istty[toStdErr] ){
          185  +    /* stdout/stderr is not a console. */
          186  +    return -1;
          187  +  }
          188  +
          189  +  nChar = MultiByteToWideChar(CP_UTF8, 0, zUtf8, nByte, NULL, 0);
          190  +  zUnicode = malloc( (nChar + 1) *sizeof(zUnicode[0]) );
          191  +  if( zUnicode==0 ){
          192  +    return 0;
          193  +  }
          194  +  nChar = MultiByteToWideChar(CP_UTF8, 0, zUtf8, nByte, zUnicode, nChar);
          195  +  if( nChar==0 ){
          196  +    free(zUnicode);
          197  +    return 0;
          198  +  }
          199  +  zUnicode[nChar] = '\0';
          200  +  WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE - toStdErr), zUnicode, nChar,
          201  +                &dummy, 0);
          202  +  return nChar;
          203  +#else
          204  +  return -1;  /* No-op on unix */
          205  +#endif
          206  +}

Changes to src/vfile.c.

   438    438     DIR *d;
   439    439     int origSize;
   440    440     const char *zDir;
   441    441     struct dirent *pEntry;
   442    442     int skipAll = 0;
   443    443     static Stmt ins;
   444    444     static int depth = 0;
   445         -  void *zMbcs;
          445  +  void *zNative;
   446    446   
   447    447     origSize = blob_size(pPath);
   448    448     if( pIgnore ){
   449    449       blob_appendf(pPath, "/");
   450    450       if( glob_match(pIgnore, &blob_str(pPath)[nPrefix+1]) ) skipAll = 1;
   451    451       blob_resize(pPath, origSize);
   452    452     }
................................................................................
   457    457          "INSERT OR IGNORE INTO sfile(x) SELECT :file"
   458    458          "  WHERE NOT EXISTS(SELECT 1 FROM vfile WHERE pathname=:file)"
   459    459       );
   460    460     }
   461    461     depth++;
   462    462   
   463    463     zDir = blob_str(pPath);
   464         -  zMbcs = fossil_utf8_to_unicode(zDir);
   465         -  d = opendir(zMbcs);
          464  +  zNative = fossil_utf8_to_unicode(zDir);
          465  +  d = opendir(zNative);
   466    466     if( d ){
   467    467       while( (pEntry=readdir(d))!=0 ){
   468    468         char *zPath;
   469    469         char *zUtf8;
   470    470         if( pEntry->d_name[0]=='.' ){
   471    471           if( (scanFlags & SCAN_ALL)==0 ) continue;
   472    472           if( pEntry->d_name[1]==0 ) continue;
   473    473           if( pEntry->d_name[1]=='.' && pEntry->d_name[2]==0 ) continue;
   474    474         }
   475         -      zUtf8 = fossil_unicode_to_utf8(pEntry->d_name);
          475  +      zUtf8 = fossil_filename_to_utf8(pEntry->d_name);
   476    476         blob_appendf(pPath, "/%s", zUtf8);
   477    477         zPath = blob_str(pPath);
   478    478         if( glob_match(pIgnore, &zPath[nPrefix+1]) ){
   479    479           /* do nothing */
   480    480         }else if( file_wd_isdir(zPath)==1 ){
   481    481           if( !vfile_top_of_checkout(zPath) ){
   482    482             vfile_scan(pPath, nPrefix, scanFlags, pIgnore);
................................................................................
   484    484         }else if( file_wd_isfile_or_link(zPath) ){
   485    485           if( (scanFlags & SCAN_TEMP)==0 || is_temporary_file(zUtf8) ){
   486    486             db_bind_text(&ins, ":file", &zPath[nPrefix+1]);
   487    487             db_step(&ins);
   488    488             db_reset(&ins);
   489    489           }
   490    490         }
   491         -      fossil_mbcs_free(zUtf8);
          491  +      fossil_filename_free(zUtf8);
   492    492         blob_resize(pPath, origSize);
   493    493       }
   494    494       closedir(d);
   495    495     }
   496         -  fossil_mbcs_free(zMbcs);
          496  +  fossil_unicode_free(zNative);
   497    497   
   498    498     depth--;
   499    499     if( depth==0 ){
   500    500       db_finalize(&ins);
   501    501     }
   502    502   }
   503    503   

Changes to src/winhttp.c.

   260    260   */
   261    261   static HttpService hsData = {8080, NULL, 0, 0, NULL, INVALID_SOCKET};
   262    262   static SERVICE_STATUS ssStatus;
   263    263   static SERVICE_STATUS_HANDLE sshStatusHandle;
   264    264   
   265    265   /*
   266    266   ** Get message string of the last system error. Return a pointer to the
   267         -** message string. Call fossil_mbcs_free() to deallocate any memory used
          267  +** message string. Call fossil_unicode_free() to deallocate any memory used
   268    268   ** to store the message string when done.
   269    269   */
   270    270   static char *win32_get_last_errmsg(void){
   271    271     DWORD nMsg;
   272    272     DWORD nErr = GetLastError();
   273    273     LPWSTR tmp = NULL;
   274    274     char *zMsg = NULL;

Changes to win/Makefile.dmc.

    24     24   CFLAGS = -o
    25     25   BCC    = $(DMDIR)\bin\dmc $(CFLAGS)
    26     26   TCC    = $(DMDIR)\bin\dmc $(CFLAGS) $(DMCDEF) $(SSL) $(INCL)
    27     27   LIBS   = $(DMDIR)\extra\lib\ zlib wsock32 advapi32
    28     28   
    29     29   SQLITE_OPTIONS = -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_STAT3 -Dlocaltime=fossil_localtime -DSQLITE_ENABLE_LOCKING_STYLE=0
    30     30   
    31         -SRC   = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c login_.c main_.c manifest_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c skins_.c sqlcmd_.c stash_.c stat_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c update_.c url_.c user_.c verify_.c vfile_.c wiki_.c wikiformat_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c 
           31  +SRC   = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c login_.c main_.c manifest_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c skins_.c sqlcmd_.c stash_.c stat_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c update_.c url_.c user_.c utf8_.c verify_.c vfile_.c wiki_.c wikiformat_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c 
    32     32   
    33         -OBJ   = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\login$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\rebuild$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\shun$O $(OBJDIR)\skins$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O 
           33  +OBJ   = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\login$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\rebuild$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\shun$O $(OBJDIR)\skins$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O 
    34     34   
    35     35   
    36     36   RC=$(DMDIR)\bin\rcc
    37     37   RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__
    38     38   
    39     39   APPNAME = $(OBJDIR)\fossil$(E)
    40     40   
................................................................................
    44     44   	cd $(OBJDIR) 
    45     45   	$(DMDIR)\bin\link @link
    46     46   
    47     47   $(OBJDIR)\fossil.res:	$B\win\fossil.rc
    48     48   	$(RC) $(RCFLAGS) -o$@ $**
    49     49   
    50     50   $(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res
    51         -	+echo add allrepo attach bag bisect blob branch browse captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo glob graph gzip http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_tag json_timeline json_user json_wiki leaf login main manifest md5 merge merge3 moderate name path pivot popen pqueue printf rebuild report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag tar th_main timeline tkt tktsetup undo update url user verify vfile wiki wikiformat winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
           51  +	+echo add allrepo attach bag bisect blob branch browse captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo glob graph gzip http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_tag json_timeline json_user json_wiki leaf login main manifest md5 merge merge3 moderate name path pivot popen pqueue printf rebuild report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag tar th_main timeline tkt tktsetup undo update url user utf8 verify vfile wiki wikiformat winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
    52     52   	+echo fossil >> $@
    53     53   	+echo fossil >> $@
    54     54   	+echo $(LIBS) >> $@
    55     55   	+echo. >> $@
    56     56   	+echo fossil >> $@
    57     57   
    58     58   translate$E: $(SRCDIR)\translate.c
................................................................................
   647    647   	+translate$E $** > $@
   648    648   
   649    649   $(OBJDIR)\user$O : user_.c user.h
   650    650   	$(TCC) -o$@ -c user_.c
   651    651   
   652    652   user_.c : $(SRCDIR)\user.c
   653    653   	+translate$E $** > $@
          654  +
          655  +$(OBJDIR)\utf8$O : utf8_.c utf8.h
          656  +	$(TCC) -o$@ -c utf8_.c
          657  +
          658  +utf8_.c : $(SRCDIR)\utf8.c
          659  +	+translate$E $** > $@
   654    660   
   655    661   $(OBJDIR)\verify$O : verify_.c verify.h
   656    662   	$(TCC) -o$@ -c verify_.c
   657    663   
   658    664   verify_.c : $(SRCDIR)\verify.c
   659    665   	+translate$E $** > $@
   660    666   
................................................................................
   703    709   $(OBJDIR)\zip$O : zip_.c zip.h
   704    710   	$(TCC) -o$@ -c zip_.c
   705    711   
   706    712   zip_.c : $(SRCDIR)\zip.c
   707    713   	+translate$E $** > $@
   708    714   
   709    715   headers: makeheaders$E page_index.h VERSION.h
   710         -	 +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h doc_.c:doc.h encode_.c:encode.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h setup_.c:setup.h sha1_.c:sha1.h shun_.c:shun.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
          716  +	 +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h captcha_.c:captcha.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h configure_.c:configure.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h doc_.c:doc.h encode_.c:encode.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h setup_.c:setup.h sha1_.c:sha1.h shun_.c:shun.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
   711    717   	@copy /Y nul: headers

Changes to win/Makefile.mingw.

   311    311     $(SRCDIR)/timeline.c \
   312    312     $(SRCDIR)/tkt.c \
   313    313     $(SRCDIR)/tktsetup.c \
   314    314     $(SRCDIR)/undo.c \
   315    315     $(SRCDIR)/update.c \
   316    316     $(SRCDIR)/url.c \
   317    317     $(SRCDIR)/user.c \
          318  +  $(SRCDIR)/utf8.c \
   318    319     $(SRCDIR)/verify.c \
   319    320     $(SRCDIR)/vfile.c \
   320    321     $(SRCDIR)/wiki.c \
   321    322     $(SRCDIR)/wikiformat.c \
   322    323     $(SRCDIR)/winhttp.c \
   323    324     $(SRCDIR)/wysiwyg.c \
   324    325     $(SRCDIR)/xfer.c \
................................................................................
   412    413     $(OBJDIR)/timeline_.c \
   413    414     $(OBJDIR)/tkt_.c \
   414    415     $(OBJDIR)/tktsetup_.c \
   415    416     $(OBJDIR)/undo_.c \
   416    417     $(OBJDIR)/update_.c \
   417    418     $(OBJDIR)/url_.c \
   418    419     $(OBJDIR)/user_.c \
          420  +  $(OBJDIR)/utf8_.c \
   419    421     $(OBJDIR)/verify_.c \
   420    422     $(OBJDIR)/vfile_.c \
   421    423     $(OBJDIR)/wiki_.c \
   422    424     $(OBJDIR)/wikiformat_.c \
   423    425     $(OBJDIR)/winhttp_.c \
   424    426     $(OBJDIR)/wysiwyg_.c \
   425    427     $(OBJDIR)/xfer_.c \
................................................................................
   513    515    $(OBJDIR)/timeline.o \
   514    516    $(OBJDIR)/tkt.o \
   515    517    $(OBJDIR)/tktsetup.o \
   516    518    $(OBJDIR)/undo.o \
   517    519    $(OBJDIR)/update.o \
   518    520    $(OBJDIR)/url.o \
   519    521    $(OBJDIR)/user.o \
          522  + $(OBJDIR)/utf8.o \
   520    523    $(OBJDIR)/verify.o \
   521    524    $(OBJDIR)/vfile.o \
   522    525    $(OBJDIR)/wiki.o \
   523    526    $(OBJDIR)/wikiformat.o \
   524    527    $(OBJDIR)/winhttp.o \
   525    528    $(OBJDIR)/wysiwyg.o \
   526    529    $(OBJDIR)/xfer.o \
................................................................................
   637    640   setup: $(OBJDIR) $(APPNAME)
   638    641   	$(MAKENSIS) ./fossil.nsi
   639    642   
   640    643   $(OBJDIR)/page_index.h: $(TRANS_SRC) $(OBJDIR)/mkindex
   641    644   	$(MKINDEX) $(TRANS_SRC) >$@
   642    645   
   643    646   $(OBJDIR)/headers:	$(OBJDIR)/page_index.h $(OBJDIR)/makeheaders $(OBJDIR)/VERSION.h
   644         -	$(MAKEHEADERS)  $(OBJDIR)/add_.c:$(OBJDIR)/add.h $(OBJDIR)/allrepo_.c:$(OBJDIR)/allrepo.h $(OBJDIR)/attach_.c:$(OBJDIR)/attach.h $(OBJDIR)/bag_.c:$(OBJDIR)/bag.h $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h $(OBJDIR)/clearsign_.c:$(OBJDIR)/clearsign.h $(OBJDIR)/clone_.c:$(OBJDIR)/clone.h $(OBJDIR)/comformat_.c:$(OBJDIR)/comformat.h $(OBJDIR)/configure_.c:$(OBJDIR)/configure.h $(OBJDIR)/content_.c:$(OBJDIR)/content.h $(OBJDIR)/db_.c:$(OBJDIR)/db.h $(OBJDIR)/delta_.c:$(OBJDIR)/delta.h $(OBJDIR)/deltacmd_.c:$(OBJDIR)/deltacmd.h $(OBJDIR)/descendants_.c:$(OBJDIR)/descendants.h $(OBJDIR)/diff_.c:$(OBJDIR)/diff.h $(OBJDIR)/diffcmd_.c:$(OBJDIR)/diffcmd.h $(OBJDIR)/doc_.c:$(OBJDIR)/doc.h $(OBJDIR)/encode_.c:$(OBJDIR)/encode.h $(OBJDIR)/event_.c:$(OBJDIR)/event.h $(OBJDIR)/export_.c:$(OBJDIR)/export.h $(OBJDIR)/file_.c:$(OBJDIR)/file.h $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h $(OBJDIR)/glob_.c:$(OBJDIR)/glob.h $(OBJDIR)/graph_.c:$(OBJDIR)/graph.h $(OBJDIR)/gzip_.c:$(OBJDIR)/gzip.h $(OBJDIR)/http_.c:$(OBJDIR)/http.h $(OBJDIR)/http_socket_.c:$(OBJDIR)/http_socket.h $(OBJDIR)/http_ssl_.c:$(OBJDIR)/http_ssl.h $(OBJDIR)/http_transport_.c:$(OBJDIR)/http_transport.h $(OBJDIR)/import_.c:$(OBJDIR)/import.h $(OBJDIR)/info_.c:$(OBJDIR)/info.h $(OBJDIR)/json_.c:$(OBJDIR)/json.h $(OBJDIR)/json_artifact_.c:$(OBJDIR)/json_artifact.h $(OBJDIR)/json_branch_.c:$(OBJDIR)/json_branch.h $(OBJDIR)/json_config_.c:$(OBJDIR)/json_config.h $(OBJDIR)/json_diff_.c:$(OBJDIR)/json_diff.h $(OBJDIR)/json_dir_.c:$(OBJDIR)/json_dir.h $(OBJDIR)/json_finfo_.c:$(OBJDIR)/json_finfo.h $(OBJDIR)/json_login_.c:$(OBJDIR)/json_login.h $(OBJDIR)/json_query_.c:$(OBJDIR)/json_query.h $(OBJDIR)/json_report_.c:$(OBJDIR)/json_report.h $(OBJDIR)/json_tag_.c:$(OBJDIR)/json_tag.h $(OBJDIR)/json_timeline_.c:$(OBJDIR)/json_timeline.h $(OBJDIR)/json_user_.c:$(OBJDIR)/json_user.h $(OBJDIR)/json_wiki_.c:$(OBJDIR)/json_wiki.h $(OBJDIR)/leaf_.c:$(OBJDIR)/leaf.h $(OBJDIR)/login_.c:$(OBJDIR)/login.h $(OBJDIR)/main_.c:$(OBJDIR)/main.h $(OBJDIR)/manifest_.c:$(OBJDIR)/manifest.h $(OBJDIR)/md5_.c:$(OBJDIR)/md5.h $(OBJDIR)/merge_.c:$(OBJDIR)/merge.h $(OBJDIR)/merge3_.c:$(OBJDIR)/merge3.h $(OBJDIR)/moderate_.c:$(OBJDIR)/moderate.h $(OBJDIR)/name_.c:$(OBJDIR)/name.h $(OBJDIR)/path_.c:$(OBJDIR)/path.h $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h $(OBJDIR)/report_.c:$(OBJDIR)/report.h $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h $(OBJDIR)/search_.c:$(OBJDIR)/search.h $(OBJDIR)/setup_.c:$(OBJDIR)/setup.h $(OBJDIR)/sha1_.c:$(OBJDIR)/sha1.h $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h $(OBJDIR)/style_.c:$(OBJDIR)/style.h $(OBJDIR)/sync_.c:$(OBJDIR)/sync.h $(OBJDIR)/tag_.c:$(OBJDIR)/tag.h $(OBJDIR)/tar_.c:$(OBJDIR)/tar.h $(OBJDIR)/th_main_.c:$(OBJDIR)/th_main.h $(OBJDIR)/timeline_.c:$(OBJDIR)/timeline.h $(OBJDIR)/tkt_.c:$(OBJDIR)/tkt.h $(OBJDIR)/tktsetup_.c:$(OBJDIR)/tktsetup.h $(OBJDIR)/undo_.c:$(OBJDIR)/undo.h $(OBJDIR)/update_.c:$(OBJDIR)/update.h $(OBJDIR)/url_.c:$(OBJDIR)/url.h $(OBJDIR)/user_.c:$(OBJDIR)/user.h $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h $(OBJDIR)/wysiwyg_.c:$(OBJDIR)/wysiwyg.h $(OBJDIR)/xfer_.c:$(OBJDIR)/xfer.h $(OBJDIR)/xfersetup_.c:$(OBJDIR)/xfersetup.h $(OBJDIR)/zip_.c:$(OBJDIR)/zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h $(OBJDIR)/VERSION.h
          647  +	$(MAKEHEADERS)  $(OBJDIR)/add_.c:$(OBJDIR)/add.h $(OBJDIR)/allrepo_.c:$(OBJDIR)/allrepo.h $(OBJDIR)/attach_.c:$(OBJDIR)/attach.h $(OBJDIR)/bag_.c:$(OBJDIR)/bag.h $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h $(OBJDIR)/clearsign_.c:$(OBJDIR)/clearsign.h $(OBJDIR)/clone_.c:$(OBJDIR)/clone.h $(OBJDIR)/comformat_.c:$(OBJDIR)/comformat.h $(OBJDIR)/configure_.c:$(OBJDIR)/configure.h $(OBJDIR)/content_.c:$(OBJDIR)/content.h $(OBJDIR)/db_.c:$(OBJDIR)/db.h $(OBJDIR)/delta_.c:$(OBJDIR)/delta.h $(OBJDIR)/deltacmd_.c:$(OBJDIR)/deltacmd.h $(OBJDIR)/descendants_.c:$(OBJDIR)/descendants.h $(OBJDIR)/diff_.c:$(OBJDIR)/diff.h $(OBJDIR)/diffcmd_.c:$(OBJDIR)/diffcmd.h $(OBJDIR)/doc_.c:$(OBJDIR)/doc.h $(OBJDIR)/encode_.c:$(OBJDIR)/encode.h $(OBJDIR)/event_.c:$(OBJDIR)/event.h $(OBJDIR)/export_.c:$(OBJDIR)/export.h $(OBJDIR)/file_.c:$(OBJDIR)/file.h $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h $(OBJDIR)/glob_.c:$(OBJDIR)/glob.h $(OBJDIR)/graph_.c:$(OBJDIR)/graph.h $(OBJDIR)/gzip_.c:$(OBJDIR)/gzip.h $(OBJDIR)/http_.c:$(OBJDIR)/http.h $(OBJDIR)/http_socket_.c:$(OBJDIR)/http_socket.h $(OBJDIR)/http_ssl_.c:$(OBJDIR)/http_ssl.h $(OBJDIR)/http_transport_.c:$(OBJDIR)/http_transport.h $(OBJDIR)/import_.c:$(OBJDIR)/import.h $(OBJDIR)/info_.c:$(OBJDIR)/info.h $(OBJDIR)/json_.c:$(OBJDIR)/json.h $(OBJDIR)/json_artifact_.c:$(OBJDIR)/json_artifact.h $(OBJDIR)/json_branch_.c:$(OBJDIR)/json_branch.h $(OBJDIR)/json_config_.c:$(OBJDIR)/json_config.h $(OBJDIR)/json_diff_.c:$(OBJDIR)/json_diff.h $(OBJDIR)/json_dir_.c:$(OBJDIR)/json_dir.h $(OBJDIR)/json_finfo_.c:$(OBJDIR)/json_finfo.h $(OBJDIR)/json_login_.c:$(OBJDIR)/json_login.h $(OBJDIR)/json_query_.c:$(OBJDIR)/json_query.h $(OBJDIR)/json_report_.c:$(OBJDIR)/json_report.h $(OBJDIR)/json_tag_.c:$(OBJDIR)/json_tag.h $(OBJDIR)/json_timeline_.c:$(OBJDIR)/json_timeline.h $(OBJDIR)/json_user_.c:$(OBJDIR)/json_user.h $(OBJDIR)/json_wiki_.c:$(OBJDIR)/json_wiki.h $(OBJDIR)/leaf_.c:$(OBJDIR)/leaf.h $(OBJDIR)/login_.c:$(OBJDIR)/login.h $(OBJDIR)/main_.c:$(OBJDIR)/main.h $(OBJDIR)/manifest_.c:$(OBJDIR)/manifest.h $(OBJDIR)/md5_.c:$(OBJDIR)/md5.h $(OBJDIR)/merge_.c:$(OBJDIR)/merge.h $(OBJDIR)/merge3_.c:$(OBJDIR)/merge3.h $(OBJDIR)/moderate_.c:$(OBJDIR)/moderate.h $(OBJDIR)/name_.c:$(OBJDIR)/name.h $(OBJDIR)/path_.c:$(OBJDIR)/path.h $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h $(OBJDIR)/report_.c:$(OBJDIR)/report.h $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h $(OBJDIR)/search_.c:$(OBJDIR)/search.h $(OBJDIR)/setup_.c:$(OBJDIR)/setup.h $(OBJDIR)/sha1_.c:$(OBJDIR)/sha1.h $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h $(OBJDIR)/style_.c:$(OBJDIR)/style.h $(OBJDIR)/sync_.c:$(OBJDIR)/sync.h $(OBJDIR)/tag_.c:$(OBJDIR)/tag.h $(OBJDIR)/tar_.c:$(OBJDIR)/tar.h $(OBJDIR)/th_main_.c:$(OBJDIR)/th_main.h $(OBJDIR)/timeline_.c:$(OBJDIR)/timeline.h $(OBJDIR)/tkt_.c:$(OBJDIR)/tkt.h $(OBJDIR)/tktsetup_.c:$(OBJDIR)/tktsetup.h $(OBJDIR)/undo_.c:$(OBJDIR)/undo.h $(OBJDIR)/update_.c:$(OBJDIR)/update.h $(OBJDIR)/url_.c:$(OBJDIR)/url.h $(OBJDIR)/user_.c:$(OBJDIR)/user.h $(OBJDIR)/utf8_.c:$(OBJDIR)/utf8.h $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h $(OBJDIR)/wysiwyg_.c:$(OBJDIR)/wysiwyg.h $(OBJDIR)/xfer_.c:$(OBJDIR)/xfer.h $(OBJDIR)/xfersetup_.c:$(OBJDIR)/xfersetup.h $(OBJDIR)/zip_.c:$(OBJDIR)/zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h $(OBJDIR)/VERSION.h
   645    648   	echo Done >$(OBJDIR)/headers
   646    649   
   647    650   $(OBJDIR)/headers: Makefile
   648    651   
   649    652   Makefile:
   650    653   
   651    654   $(OBJDIR)/add_.c:	$(SRCDIR)/add.c $(OBJDIR)/translate
................................................................................
  1363   1366   $(OBJDIR)/user_.c:	$(SRCDIR)/user.c $(OBJDIR)/translate
  1364   1367   	$(TRANSLATE) $(SRCDIR)/user.c >$(OBJDIR)/user_.c
  1365   1368   
  1366   1369   $(OBJDIR)/user.o:	$(OBJDIR)/user_.c $(OBJDIR)/user.h  $(SRCDIR)/config.h
  1367   1370   	$(XTCC) -o $(OBJDIR)/user.o -c $(OBJDIR)/user_.c
  1368   1371   
  1369   1372   $(OBJDIR)/user.h:	$(OBJDIR)/headers
         1373  +
         1374  +$(OBJDIR)/utf8_.c:	$(SRCDIR)/utf8.c $(OBJDIR)/translate
         1375  +	$(TRANSLATE) $(SRCDIR)/utf8.c >$(OBJDIR)/utf8_.c
         1376  +
         1377  +$(OBJDIR)/utf8.o:	$(OBJDIR)/utf8_.c $(OBJDIR)/utf8.h  $(SRCDIR)/config.h
         1378  +	$(XTCC) -o $(OBJDIR)/utf8.o -c $(OBJDIR)/utf8_.c
         1379  +
         1380  +$(OBJDIR)/utf8.h:	$(OBJDIR)/headers
  1370   1381   
  1371   1382   $(OBJDIR)/verify_.c:	$(SRCDIR)/verify.c $(OBJDIR)/translate
  1372   1383   	$(TRANSLATE) $(SRCDIR)/verify.c >$(OBJDIR)/verify_.c
  1373   1384   
  1374   1385   $(OBJDIR)/verify.o:	$(OBJDIR)/verify_.c $(OBJDIR)/verify.h  $(SRCDIR)/config.h
  1375   1386   	$(XTCC) -o $(OBJDIR)/verify.o -c $(OBJDIR)/verify_.c
  1376   1387   

Changes to win/Makefile.msc.

   126    126           timeline_.c \
   127    127           tkt_.c \
   128    128           tktsetup_.c \
   129    129           undo_.c \
   130    130           update_.c \
   131    131           url_.c \
   132    132           user_.c \
          133  +        utf8_.c \
   133    134           verify_.c \
   134    135           vfile_.c \
   135    136           wiki_.c \
   136    137           wikiformat_.c \
   137    138           winhttp_.c \
   138    139           wysiwyg_.c \
   139    140           xfer_.c \
................................................................................
   226    227           $(OX)\timeline$O \
   227    228           $(OX)\tkt$O \
   228    229           $(OX)\tktsetup$O \
   229    230           $(OX)\undo$O \
   230    231           $(OX)\update$O \
   231    232           $(OX)\url$O \
   232    233           $(OX)\user$O \
          234  +        $(OX)\utf8$O \
   233    235           $(OX)\verify$O \
   234    236           $(OX)\vfile$O \
   235    237           $(OX)\wiki$O \
   236    238           $(OX)\wikiformat$O \
   237    239           $(OX)\winhttp$O \
   238    240           $(OX)\wysiwyg$O \
   239    241           $(OX)\xfer$O \
................................................................................
   347    349   	echo $(OX)\timeline.obj >> $@
   348    350   	echo $(OX)\tkt.obj >> $@
   349    351   	echo $(OX)\tktsetup.obj >> $@
   350    352   	echo $(OX)\undo.obj >> $@
   351    353   	echo $(OX)\update.obj >> $@
   352    354   	echo $(OX)\url.obj >> $@
   353    355   	echo $(OX)\user.obj >> $@
          356  +	echo $(OX)\utf8.obj >> $@
   354    357   	echo $(OX)\verify.obj >> $@
   355    358   	echo $(OX)\vfile.obj >> $@
   356    359   	echo $(OX)\wiki.obj >> $@
   357    360   	echo $(OX)\wikiformat.obj >> $@
   358    361   	echo $(OX)\winhttp.obj >> $@
   359    362   	echo $(OX)\wysiwyg.obj >> $@
   360    363   	echo $(OX)\xfer.obj >> $@
................................................................................
   968    971   	translate$E $** > $@
   969    972   
   970    973   $(OX)\user$O : user_.c user.h
   971    974   	$(TCC) /Fo$@ -c user_.c
   972    975   
   973    976   user_.c : $(SRCDIR)\user.c
   974    977   	translate$E $** > $@
          978  +
          979  +$(OX)\utf8$O : utf8_.c utf8.h
          980  +	$(TCC) /Fo$@ -c utf8_.c
          981  +
          982  +utf8_.c : $(SRCDIR)\utf8.c
          983  +	translate$E $** > $@
   975    984   
   976    985   $(OX)\verify$O : verify_.c verify.h
   977    986   	$(TCC) /Fo$@ -c verify_.c
   978    987   
   979    988   verify_.c : $(SRCDIR)\verify.c
   980    989   	translate$E $** > $@
   981    990   
................................................................................
  1114   1123   			timeline_.c:timeline.h \
  1115   1124   			tkt_.c:tkt.h \
  1116   1125   			tktsetup_.c:tktsetup.h \
  1117   1126   			undo_.c:undo.h \
  1118   1127   			update_.c:update.h \
  1119   1128   			url_.c:url.h \
  1120   1129   			user_.c:user.h \
         1130  +			utf8_.c:utf8.h \
  1121   1131   			verify_.c:verify.h \
  1122   1132   			vfile_.c:vfile.h \
  1123   1133   			wiki_.c:wiki.h \
  1124   1134   			wikiformat_.c:wikiformat.h \
  1125   1135   			winhttp_.c:winhttp.h \
  1126   1136   			wysiwyg_.c:wysiwyg.h \
  1127   1137   			xfer_.c:xfer.h \