Changes On Branch utf8-in-sources
Not logged in

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

Changes In Branch utf8-in-sources Excluding Merge-Ins

This is equivalent to a diff from eb82a23827 to e9f38ae8ab

2012-08-29
19:41
Allow UTF-8 characters in sources. translate.exe will translate it to ASCII check-in: 208d67675c user: jan.nijtmans tags: trunk
13:57
Allow UTF-8 characters in sources. translate.exe will translate it to ASCII check-in: 9f6abc5968 user: jan.nijtmans tags: msvc-broken
13:03
merge trunk Closed-Leaf check-in: e9f38ae8ab user: jan.nijtmans tags: utf8-in-sources
13:01
Слил правки из trunk check-in: 4f6d1cd301 user: orefkov tags: orefkovs-change
11:27
fix for [01a2f3a346] check-in: 0357ed556e user: jan.nijtmans tags: msvc-broken
10:44
Fix a typo on the Ticket Change Details page. check-in: eb82a23827 user: drh tags: trunk
2012-08-28
17:39
Fixes to hyperlink generation for embedded documentation. check-in: ed6adcaf3b user: drh tags: trunk
06:24
This change allows html entities (like → and •) in all c-sources to be replaced by its utf-8 equivalent (→,•). The translate utility will translate this to the right escape-sequence, so the C-compiler can handle it. As long as the C-source doesn't contain any utf-8 characters, this generates exactly the same *_.c file... check-in: b5e2e50040 user: jan.nijtmans tags: utf8-in-sources

Changes to src/branch.c.

     1      1   /*
     2         -** Copyright (c) 2007 D. Richard Hipp
            2  +** Copyright © 2007 D. Richard Hipp
     3      3   **
     4      4   ** This program is free software; you can redistribute it and/or
     5      5   ** modify it under the terms of the Simplified BSD License (also
     6      6   ** known as the "2-Clause License" or "FreeBSD License".)
     7      7   
     8      8   ** This program is distributed in the hope that it will be useful,
     9      9   ** but without any warranty; without even the implied warranty of
................................................................................
   353    353         }
   354    354         @ <ul>
   355    355         cnt++;
   356    356       }
   357    357       if( colorTest ){
   358    358         const char *zColor = hash_color(zBr);
   359    359         @ <li><span style="background-color: %s(zColor)">
   360         -      @ %h(zBr) &rarr; %s(zColor)</span></li>
          360  +      @ %h(zBr) → %s(zColor)</span></li>
   361    361       }else{
   362    362         @ <li>%z(href("%R/timeline?r=%T",zBr))%h(zBr)</a></li>
   363    363       }
   364    364     }
   365    365     if( cnt ){
   366    366       @ </ul>
   367    367     }

Changes to src/export.c.

     1      1   /*
     2         -** Copyright (c) 2010 D. Richard Hipp
            2  +** Copyright © 2010 D. Richard Hipp
     3      3   **
     4      4   ** This program is free software; you can redistribute it and/or
     5      5   ** modify it under the terms of the Simplified BSD License (also
     6      6   ** known as the "2-Clause License" or "FreeBSD License".)
     7      7   
     8      8   ** This program is distributed in the hope that it will be useful,
     9      9   ** but without any warranty; without even the implied warranty of
................................................................................
   134    134     db_multi_exec("CREATE TEMPORARY TABLE oldblob(rid INTEGER PRIMARY KEY)");
   135    135     db_multi_exec("CREATE TEMPORARY TABLE oldcommit(rid INTEGER PRIMARY KEY)");
   136    136     if( markfile_in!=0 ){
   137    137       Stmt qb,qc;
   138    138       char line[100];
   139    139       FILE *f;
   140    140   
   141         -    f = fopen(markfile_in, "r");
          141  +    f = fossil_fopen(markfile_in, "r");
   142    142       if( f==0 ){
   143    143         fossil_panic("cannot open %s for reading", markfile_in);
   144    144       }
   145    145       db_prepare(&qb, "INSERT OR IGNORE INTO oldblob VALUES (:rid)");
   146    146       db_prepare(&qc, "INSERT OR IGNORE INTO oldcommit VALUES (:rid)");
   147    147       while( fgets(line, sizeof(line), f)!=0 ){
   148    148         if( *line == 'b' ){
................................................................................
   323    323       fossil_free(zEncoded);
   324    324     }
   325    325     db_finalize(&q);
   326    326     bag_clear(&vers);
   327    327   
   328    328     if( markfile_out!=0 ){
   329    329       FILE *f;
   330         -    f = fopen(markfile_out, "w");
          330  +    f = fossil_fopen(markfile_out, "w");
   331    331       if( f == 0 ){
   332    332         fossil_panic("cannot open %s for writing", markfile_out);
   333    333       }
   334    334       db_prepare(&q, "SELECT rid FROM oldblob");
   335    335       while( db_step(&q)==SQLITE_ROW ){
   336    336         fprintf(f, "b%d\n", db_column_int(&q, 0));
   337    337       }

Changes to src/file.c.

     1      1   /*
     2         -** Copyright (c) 2006 D. Richard Hipp
            2  +** Copyright © 2006 D. Richard Hipp
     3      3   **
     4      4   ** This program is free software; you can redistribute it and/or
     5      5   ** modify it under the terms of the Simplified BSD License (also
     6      6   ** known as the "2-Clause License" or "FreeBSD License".)
     7      7   
     8      8   ** This program is distributed in the hope that it will be useful,
     9      9   ** but without any warranty; without even the implied warranty of
................................................................................
    30     30   #include <errno.h>
    31     31   #include "file.h"
    32     32   
    33     33   /*
    34     34   ** On Windows, include the Platform SDK header file.
    35     35   */
    36     36   #ifdef _WIN32
           37  +# include <direct.h>
    37     38   # include <windows.h>
    38     39   #endif
    39     40   
    40     41   /*
    41     42   ** The file status information from the most recent stat() call.
    42     43   **
    43     44   ** Use _stati64 rather than stat on windows, in order to handle files
................................................................................
    66     67     if( isWd && g.allowSymlinks ){
    67     68       return lstat(zFilename, buf);
    68     69     }else{
    69     70       return stat(zFilename, buf);
    70     71     }
    71     72   #else
    72     73     int rc = 0;
    73         -  char *zMbcs = fossil_utf8_to_mbcs(zFilename);
    74         -  rc = stat(zMbcs, buf);
           74  +  wchar_t *zMbcs = fossil_utf8_to_unicode(zFilename);
           75  +  rc = _wstati64(zMbcs, buf);
    75     76     fossil_mbcs_free(zMbcs);
    76     77     return rc;
    77     78   #endif
    78     79   }
    79     80   
    80     81   /*
    81     82   ** Fill in the fileStat variable for the file named zFilename.
................................................................................
   296    297   }
   297    298   
   298    299   
   299    300   /*
   300    301   ** Wrapper around the access() system call.
   301    302   */
   302    303   int file_access(const char *zFilename, int flags){
   303         -  char *zMbcs = fossil_utf8_to_mbcs(zFilename);
   304         -  int rc = access(zMbcs, flags);
          304  +#ifdef _WIN32
          305  +  wchar_t *zMbcs = fossil_utf8_to_unicode(zFilename);
          306  +  int rc = _waccess(zMbcs, flags);
   305    307     fossil_mbcs_free(zMbcs);
          308  +#else
          309  +  int rc = access(zFilename, flags);
          310  +#endif
   306    311     return rc;
   307    312   }
   308    313   
   309    314   /*
   310    315   ** Find an unused filename similar to zBase with zSuffix appended.
   311    316   **
   312    317   ** Make the name relative to the working directory if relFlag is true.
................................................................................
   387    392     return rc;
   388    393   }
   389    394   
   390    395   /*
   391    396   ** Delete a file.
   392    397   */
   393    398   void file_delete(const char *zFilename){
   394         -  char *z = fossil_utf8_to_mbcs(zFilename);
   395         -  unlink(z);
          399  +#ifdef _WIN32
          400  +  wchar_t *z = fossil_utf8_to_unicode(zFilename);
          401  +  _wunlink(z);
   396    402     fossil_mbcs_free(z);
          403  +#else
          404  +  unlink(zFilename);
          405  +#endif
   397    406   }
   398    407   
   399    408   /*
   400    409   ** Create the directory named in the argument, if it does not already
   401    410   ** exist.  If forceFlag is 1, delete any prior non-directory object 
   402    411   ** with the same name.
   403    412   **
................................................................................
   408    417     if( rc==2 ){
   409    418       if( !forceFlag ) return 1;
   410    419       file_delete(zName);
   411    420     }
   412    421     if( rc!=1 ){
   413    422   #if defined(_WIN32)
   414    423       int rc;
   415         -    char *zMbcs = fossil_utf8_to_mbcs(zName);
   416         -    rc = mkdir(zMbcs);
          424  +    wchar_t *zMbcs = fossil_utf8_to_unicode(zName);
          425  +    rc = _wmkdir(zMbcs);
   417    426       fossil_mbcs_free(zMbcs);
   418    427       return rc;
   419    428   #else
   420    429       return mkdir(zName, 0755);
   421    430   #endif
   422    431     }
   423    432     return 0;
................................................................................
   559    568       fossil_free(z);
   560    569     }
   561    570   }
   562    571   
   563    572   /*
   564    573   ** Get the current working directory.
   565    574   **
   566         -** On windows, the name is converted from MBCS to UTF8 and all '\\'
          575  +** On windows, the name is converted from unicode to UTF8 and all '\\'
   567    576   ** characters are converted to '/'.  No conversions are needed on
   568    577   ** unix.
   569    578   */
   570    579   void file_getcwd(char *zBuf, int nBuf){
   571    580   #ifdef _WIN32
   572    581     char *zPwdUtf8;
   573    582     int nPwd;
   574    583     int i;
   575         -  char zPwd[2000];
   576         -  if( getcwd(zPwd, sizeof(zPwd)-1)==0 ){
          584  +  wchar_t zPwd[2000];
          585  +  if( _wgetcwd(zPwd, sizeof(zPwd)-1)==0 ){
   577    586       fossil_fatal("cannot find the current working directory.");
   578    587     }
   579         -  zPwdUtf8 = fossil_mbcs_to_utf8(zPwd);
          588  +  zPwdUtf8 = fossil_unicode_to_utf8(zPwd);
   580    589     nPwd = strlen(zPwdUtf8);
   581    590     if( nPwd > nBuf-1 ){
   582    591       fossil_fatal("pwd too big: max %d\n", nBuf-1);
   583    592     }
   584    593     for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/';
   585    594     memcpy(zBuf, zPwdUtf8, nPwd+1);
   586    595     fossil_mbcs_free(zPwdUtf8);
................................................................................
   926    935       "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
   927    936       "0123456789";
   928    937     unsigned int i, j;
   929    938     const char *zDir = ".";
   930    939     int cnt = 0;
   931    940   
   932    941   #if defined(_WIN32)
   933         -  char zTmpPath[MAX_PATH];
          942  +  wchar_t zTmpPath[MAX_PATH];
   934    943   
   935         -  if( GetTempPath(sizeof(zTmpPath), zTmpPath) ){
   936         -    azDirs[0] = zTmpPath;
          944  +  if( GetTempPathW(MAX_PATH, zTmpPath) ){
          945  +    azDirs[0] = fossil_unicode_to_utf8(zTmpPath);
   937    946     }
   938    947   
   939    948     azDirs[1] = fossil_getenv("TEMP");
   940    949     azDirs[2] = fossil_getenv("TMP");
   941    950   #endif
   942    951   
   943    952     
................................................................................
  1012   1021   #ifdef _WIN32
  1013   1022     extern char *sqlite3_win32_mbcs_to_utf8(const char*);
  1014   1023     return sqlite3_win32_mbcs_to_utf8(zMbcs);
  1015   1024   #else
  1016   1025     return (char*)zMbcs;  /* No-op on unix */
  1017   1026   #endif  
  1018   1027   }
         1028  +
         1029  +/*
         1030  +** Translate Unicode to UTF8.  Return a pointer to the translated text.
         1031  +** Call fossil_mbcs_free() to deallocate any memory used to store the
         1032  +** returned pointer when done.
         1033  +*/
         1034  +char *fossil_unicode_to_utf8(const void *zUnicode){
         1035  +#ifdef _WIN32
         1036  +  int nByte = WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, 0, 0, 0, 0);
         1037  +  char *zUtf = sqlite3_malloc( nByte );
         1038  +  if( zUtf==0 ){
         1039  +    return 0;
         1040  +  }
         1041  +  WideCharToMultiByte(CP_UTF8, 0, zUnicode, -1, zUtf, nByte, 0, 0);
         1042  +  return zUtf;
         1043  +#else
         1044  +  return (char *)zUnicode;  /* No-op on unix */
         1045  +#endif
         1046  +}
  1019   1047   
  1020   1048   /*
  1021   1049   ** Translate UTF8 to MBCS for use in system calls.  Return a pointer to the
  1022   1050   ** translated text..  Call fossil_mbcs_free() to deallocate any memory
  1023   1051   ** used to store the returned pointer when done.
  1024   1052   */
  1025   1053   char *fossil_utf8_to_mbcs(const char *zUtf8){
................................................................................
  1026   1054   #ifdef _WIN32
  1027   1055     extern char *sqlite3_win32_utf8_to_mbcs(const char*);
  1028   1056     return sqlite3_win32_utf8_to_mbcs(zUtf8);
  1029   1057   #else
  1030   1058     return (char*)zUtf8;  /* No-op on unix */
  1031   1059   #endif  
  1032   1060   }
         1061  +
         1062  +/*
         1063  +** Translate UTF8 to unicode for use in system calls.  Return a pointer to the
         1064  +** translated text..  Call fossil_mbcs_free() to deallocate any memory
         1065  +** used to store the returned pointer when done.
         1066  +*/
         1067  +void *fossil_utf8_to_unicode(const char *zUtf8){
         1068  +#ifdef _WIN32
         1069  +  int nByte = MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, 0, 0);
         1070  +  wchar_t *zUnicode = sqlite3_malloc( nByte * 2 );
         1071  +  if( zUnicode==0 ){
         1072  +    return 0;
         1073  +  }
         1074  +  MultiByteToWideChar(CP_UTF8, 0, zUtf8, -1, zUnicode, nByte);
         1075  +  return zUnicode;
         1076  +#else
         1077  +  return (void *)zUtf8;  /* No-op on unix */
         1078  +#endif
         1079  +}
  1033   1080   
  1034   1081   /*
  1035   1082   ** Return the value of an environment variable as UTF8.
  1036   1083   */
  1037   1084   char *fossil_getenv(const char *zName){
  1038         -  char *zValue = getenv(zName);
  1039   1085   #ifdef _WIN32
  1040         -  if( zValue ) zValue = fossil_mbcs_to_utf8(zValue);
         1086  +  wchar_t *uName = fossil_utf8_to_unicode(zName);
         1087  +  void *zValue = _wgetenv(uName);
         1088  +  fossil_mbcs_free(uName);
         1089  +  if( zValue ) zValue = fossil_unicode_to_utf8(zValue);
         1090  +#else
         1091  +  char *zValue = getenv(zName);
  1041   1092   #endif
  1042   1093     return zValue;
  1043   1094   }
  1044   1095   
  1045   1096   /*
  1046   1097   ** Translate UTF8 to MBCS for display on the console.  Return a pointer to the
  1047   1098   ** translated text..  Call fossil_mbcs_free() to deallocate any memory
................................................................................
  1083   1134   #endif  
  1084   1135   }
  1085   1136   
  1086   1137   /*
  1087   1138   ** Translate MBCS to UTF8.  Return a pointer.  Call fossil_mbcs_free()
  1088   1139   ** to deallocate any memory used to store the returned pointer when done.
  1089   1140   */
  1090         -void fossil_mbcs_free(char *zOld){
         1141  +void fossil_mbcs_free(void *zOld){
  1091   1142   #ifdef _WIN32
  1092   1143     extern void sqlite3_free(void*);
  1093   1144     sqlite3_free(zOld);
  1094   1145   #else
  1095   1146     /* No-op on unix */
  1096   1147   #endif  
  1097   1148   }
  1098   1149   
  1099   1150   /*
  1100   1151   ** Like fopen() but always takes a UTF8 argument.
  1101   1152   */
  1102   1153   FILE *fossil_fopen(const char *zName, const char *zMode){
  1103         -  char *zMbcs = fossil_utf8_to_mbcs(zName);
  1104         -  FILE *f = fopen(zMbcs, zMode);
  1105         -  fossil_mbcs_free(zMbcs);
         1154  +#ifdef _WIN32
         1155  +  wchar_t *uMode = fossil_utf8_to_unicode(zMode);
         1156  +  wchar_t *uName = fossil_utf8_to_unicode(zName);
         1157  +  FILE *f = _wfopen(uName, uMode);
         1158  +  fossil_mbcs_free(uName);
         1159  +  fossil_mbcs_free(uMode);
         1160  +#else
         1161  +  FILE *f = fopen(zName, zMode);
         1162  +#endif
  1106   1163     return f;
  1107   1164   }

Changes to src/import.c.

     1      1   /*
     2         -** Copyright (c) 2010 D. Richard Hipp
            2  +** Copyright © 2010 D. Richard Hipp
     3      3   **
     4      4   ** This program is free software; you can redistribute it and/or
     5      5   ** modify it under the terms of the Simplified BSD License (also
     6      6   ** known as the "2-Clause License" or "FreeBSD License".)
     7      7   
     8      8   ** This program is distributed in the hope that it will be useful,
     9      9   ** but without any warranty; without even the implied warranty of
................................................................................
   730    730   
   731    731     find_option("git",0,0);  /* Skip the --git option for now */
   732    732     verify_all_options();
   733    733     if( g.argc!=3  && g.argc!=4 ){
   734    734       usage("REPOSITORY-NAME");
   735    735     }
   736    736     if( g.argc==4 ){
   737         -    pIn = fopen(g.argv[3], "rb");
          737  +    pIn = fossil_fopen(g.argv[3], "rb");
   738    738     }else{
   739    739       pIn = stdin;
   740    740       fossil_binary_mode(pIn);
   741    741     }
   742    742     if( !incrFlag ){
   743    743       if( forceFlag ) file_delete(g.argv[2]);
   744    744       db_create_repository(g.argv[2]);

Changes to src/rebuild.c.

    19     19   */
    20     20   #include "config.h"
    21     21   #include "rebuild.h"
    22     22   #include <assert.h>
    23     23   #include <dirent.h>
    24     24   #include <errno.h>
    25     25   
           26  +#ifndef _WIN32
           27  +#define _WDIR DIR
           28  +#define _wdirent dirent
           29  +#define _wopendir opendir
           30  +#define _wreaddir readdir
           31  +#define _wclosedir closedir
           32  +#define wchar_t char
           33  +#endif
           34  +
    26     35   /*
    27     36   ** Make changes to the stable part of the schema (the part that is not
    28     37   ** simply deleted and reconstructed on a rebuild) to bring the schema
    29     38   ** up to the latest.
    30     39   */
    31     40   static const char zSchemaUpdates1[] =
    32     41   @ -- Index on the delta table
................................................................................
   816    825   }
   817    826   
   818    827   /*
   819    828   ** Recursively read all files from the directory zPath and install
   820    829   ** every file read as a new artifact in the repository.
   821    830   */
   822    831   void recon_read_dir(char *zPath){
   823         -  DIR *d;
   824         -  struct dirent *pEntry;
          832  +  _WDIR *d;
          833  +  struct _wdirent *pEntry;
   825    834     Blob aContent; /* content of the just read artifact */
   826    835     static int nFileRead = 0;
   827         -  char *zMbcsPath;
          836  +  wchar_t *zMbcsPath;
   828    837     char *zUtf8Name;
   829    838   
   830         -  zMbcsPath = fossil_utf8_to_mbcs(zPath);
   831         -  d = opendir(zMbcsPath);
          839  +  zMbcsPath = fossil_utf8_to_unicode(zPath);
          840  +  d = _wopendir(zMbcsPath);
   832    841     if( d ){
   833         -    while( (pEntry=readdir(d))!=0 ){
          842  +    while( (pEntry=_wreaddir(d))!=0 ){
   834    843         Blob path;
   835    844         char *zSubpath;
   836    845   
   837    846         if( pEntry->d_name[0]=='.' ){
   838    847           continue;
   839    848         }
   840         -      zUtf8Name = fossil_mbcs_to_utf8(pEntry->d_name);
          849  +      zUtf8Name = fossil_unicode_to_utf8(pEntry->d_name);
   841    850         zSubpath = mprintf("%s/%s", zPath, zUtf8Name);
   842    851         fossil_mbcs_free(zUtf8Name);
   843    852         if( file_isdir(zSubpath)==1 ){
   844    853           recon_read_dir(zSubpath);
   845    854         }
   846    855         blob_init(&path, 0, 0);
   847    856         blob_appendf(&path, "%s", zSubpath);
................................................................................
   852    861         content_put(&aContent);
   853    862         blob_reset(&path);
   854    863         blob_reset(&aContent);
   855    864         free(zSubpath);
   856    865         fossil_print("\r%d", ++nFileRead);
   857    866         fflush(stdout);
   858    867       }
   859         -    closedir(d);
          868  +    _wclosedir(d);
   860    869     }else {
   861    870       fossil_panic("encountered error %d while trying to open \"%s\".",
   862    871                     errno, g.argv[3]);
   863    872     }
   864    873     fossil_mbcs_free(zMbcsPath);
   865    874   }
   866    875   

Changes to src/setup.c.

     1      1   /*
     2         -** Copyright (c) 2007 D. Richard Hipp
            2  +** Copyright © 2007 D. Richard Hipp
     3      3   **
     4      4   ** This program is free software; you can redistribute it and/or
     5      5   ** modify it under the terms of the Simplified BSD License (also
     6      6   ** known as the "2-Clause License" or "FreeBSD License".)
     7      7   
     8      8   ** This program is distributed in the hope that it will be useful,
     9      9   ** but without any warranty; without even the implied warranty of
................................................................................
   494    494     /* figure out inherited permissions */
   495    495     memset(inherit, 0, sizeof(inherit));
   496    496     if( fossil_strcmp(zLogin, "developer") ){
   497    497       char *z1, *z2;
   498    498       z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='developer'");
   499    499       while( z1 && *z1 ){
   500    500         inherit[0x7f & *(z1++)] =
   501         -         "<span class=\"ueditInheritDeveloper\">&bull;</span>";
          501  +         "<span class=\"ueditInheritDeveloper\">•</span>";
   502    502       }
   503    503       free(z2);
   504    504     }
   505    505     if( fossil_strcmp(zLogin, "reader") ){
   506    506       char *z1, *z2;
   507    507       z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='reader'");
   508    508       while( z1 && *z1 ){
   509    509         inherit[0x7f & *(z1++)] =
   510         -          "<span class=\"ueditInheritReader\">&bull;</span>";
          510  +          "<span class=\"ueditInheritReader\">•</span>";
   511    511       }
   512    512       free(z2);
   513    513     }
   514    514     if( fossil_strcmp(zLogin, "anonymous") ){
   515    515       char *z1, *z2;
   516    516       z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='anonymous'");
   517    517       while( z1 && *z1 ){
   518    518         inherit[0x7f & *(z1++)] =
   519         -           "<span class=\"ueditInheritAnonymous\">&bull;</span>";
          519  +           "<span class=\"ueditInheritAnonymous\">•</span>";
   520    520       }
   521    521       free(z2);
   522    522     }
   523    523     if( fossil_strcmp(zLogin, "nobody") ){
   524    524       char *z1, *z2;
   525    525       z1 = z2 = db_text(0,"SELECT cap FROM user WHERE login='nobody'");
   526    526       while( z1 && *z1 ){
   527    527         inherit[0x7f & *(z1++)] =
   528         -           "<span class=\"ueditInheritNobody\">&bull;</span>";
          528  +           "<span class=\"ueditInheritNobody\">•</span>";
   529    529       }
   530    530       free(z2);
   531    531     }
   532    532   
   533    533     /* Begin generating the page
   534    534     */
   535    535     style_submenu_element("Cancel", "Cancel", "setup_ulist");
................................................................................
   660    660     @ configuration changes. An <span class="usertype">Admin</span> user
   661    661     @ can add other users and change user privileges
   662    662     @ and reset user passwords.  Both automatically get all other privileges
   663    663     @ listed below.  Use these two settings with discretion.
   664    664     @ </p></li>
   665    665     @
   666    666     @ <li><p>
   667         -  @ The "<span class="ueditInheritNobody"><big>&bull;</big></span>" mark
          667  +  @ The "<span class="ueditInheritNobody"><big>•</big></span>" mark
   668    668     @ indicates the privileges of <span class="usertype">nobody</span> that
   669    669     @ are available to all users regardless of whether or not they are logged in.
   670    670     @ </p></li>
   671    671     @
   672    672     @ <li><p>
   673         -  @ The "<span class="ueditInheritAnonymous"><big>&bull;</big></span>" mark
          673  +  @ The "<span class="ueditInheritAnonymous"><big>•</big></span>" mark
   674    674     @ indicates the privileges of <span class="usertype">anonymous</span> that
   675    675     @ are inherited by all logged-in users.
   676    676     @ </p></li>
   677    677     @
   678    678     @ <li><p>
   679         -  @ The "<span class="ueditInheritDeveloper"><big>&bull;</big></span>" mark
          679  +  @ The "<span class="ueditInheritDeveloper"><big>•</big></span>" mark
   680    680     @ indicates the privileges of <span class="usertype">developer</span> that
   681    681     @ are inherited by all users with the
   682    682     @ <span class="capability">Developer</span> privilege.
   683    683     @ </p></li>
   684    684     @
   685    685     @ <li><p>
   686         -  @ The "<span class="ueditInheritReader"><big>&bull;</big></span>" mark
          686  +  @ The "<span class="ueditInheritReader"><big>•</big></span>" mark
   687    687     @ indicates the privileges of <span class="usertype">reader</span> that
   688    688     @ are inherited by all users with the <span class="capability">Reader</span>
   689    689     @ privilege.
   690    690     @ </p></li>
   691    691     @
   692    692     @ <li><p>
   693    693     @ The <span class="capability">Delete</span> privilege give the user the
................................................................................
  1614   1614     }
  1615   1615     db_begin_transaction();
  1616   1616     style_header("Raw SQL Commands");
  1617   1617     @ <p><b>Caution:</b> There are no restrictions on the SQL that can be
  1618   1618     @ run by this page.  You can do serious and irrepairable damage to the
  1619   1619     @ repository.  Proceed with extreme caution.</p>
  1620   1620     @
  1621         -  @ <p>Database names:<ul><li>repository &rarr; %s(db_name("repository"))
         1621  +  @ <p>Database names:<ul><li>repository → %s(db_name("repository"))
  1622   1622     if( g.configOpen ){
  1623         -    @ <li>config &rarr; %s(db_name("configdb"))
         1623  +    @ <li>config → %s(db_name("configdb"))
  1624   1624     }
  1625   1625     if( g.localOpen ){
  1626         -    @ <li>local-checkout &rarr; %s(db_name("localdb"))
         1626  +    @ <li>local-checkout → %s(db_name("localdb"))
  1627   1627     }
  1628   1628     @ </ul></p>
  1629   1629     @
  1630   1630     @ <form method="post" action="%s(g.zTop)/admin_sql">
  1631   1631     login_insert_csrf_secret();
  1632   1632     @ SQL:<br />
  1633   1633     @ <textarea name="q" rows="5" cols="80">%h(zQ)</textarea><br />

Changes to src/timeline.c.

     1      1   /*
     2         -** Copyright (c) 2007 D. Richard Hipp
            2  +** Copyright © 2007 D. Richard Hipp
     3      3   **
     4      4   ** This program is free software; you can redistribute it and/or
     5      5   ** modify it under the terms of the Simplified BSD License (also
     6      6   ** known as the "2-Clause License" or "FreeBSD License".)
     7      7   
     8      8   ** This program is distributed in the hope that it will be useful,
     9      9   ** but without any warranty; without even the implied warranty of
................................................................................
   316    316       @</td>
   317    317       if( zBgClr && zBgClr[0] ){
   318    318         @ <td class="timelineTableCell" style="background-color: %h(zBgClr);">
   319    319       }else{
   320    320         @ <td class="timelineTableCell">
   321    321       }
   322    322       if( pGraph && zType[0]!='c' ){
   323         -      @ &bull;
          323  +      @ •
   324    324       }
   325    325       if( zType[0]=='c' ){
   326    326         hyperlink_to_uuid(zUuid);
   327    327         if( isLeaf ){
   328    328           if( db_exists("SELECT 1 FROM tagxref"
   329    329                         " WHERE rid=%d AND tagid=%d AND tagtype>0",
   330    330                         rid, TAG_CLOSED) ){
................................................................................
   434    434           if( isNew ){
   435    435             @ <li> %h(zFilename) (new file) &nbsp;
   436    436             @ %z(xhref("target='diffwindow'","%R/artifact/%S",zNew))
   437    437             @ [view]</a></li>
   438    438           }else if( isDel ){
   439    439             @ <li> %h(zFilename) (deleted)</li>
   440    440           }else if( fossil_strcmp(zOld,zNew)==0 && zOldName!=0 ){
   441         -          @ <li> %h(zOldName) &rarr; %h(zFilename)
          441  +          @ <li> %h(zOldName) → %h(zFilename)
   442    442             @ %z(xhref("target='diffwindow'","%R/artifact/%S",zNew))
   443    443             @ [view]</a></li>
   444    444           }else{
   445    445             if( zOldName!=0 ){
   446         -            @ <li> %h(zOldName) &rarr; %h(zFilename)
          446  +            @ <li> %h(zOldName) → %h(zFilename)
   447    447             }else{
   448    448               @ <li> %h(zFilename) &nbsp;
   449    449             }
   450    450             @ %z(xhref("target='diffwindow'","%R/fdiff?v1=%S&v2=%S",zOld,zNew))
   451    451             @ [diff]</a></li>
   452    452           }
   453    453         }

Changes to src/translate.c.

     1      1   /*
     2         -** Copyright (c) 2002 D. Richard Hipp
            2  +** Copyright © 2002 D. Richard Hipp
     3      3   **
     4      4   ** This program is free software; you can redistribute it and/or
     5      5   ** modify it under the terms of the Simplified BSD License (also
     6      6   ** known as the "2-Clause License" or "FreeBSD License".)
     7      7   
     8      8   ** This program is distributed in the hope that it will be useful,
     9      9   ** but without any warranty; without even the implied warranty of
................................................................................
    74     74   static void trans(FILE *in, FILE *out){
    75     75     int i, j, k;          /* Loop counters */
    76     76     char c1, c2;          /* Characters used to start a comment */
    77     77     int lastWasEq = 0;    /* True if last non-whitespace character was "=" */
    78     78     int lastWasComma = 0; /* True if last non-whitespace character was "," */
    79     79     char zLine[2000];     /* A single line of input */
    80     80     char zOut[4000];      /* The input line translated into appropriate output */
           81  +  int isFirstline = 1;  /* True if this is the first line */
    81     82   
    82     83     c1 = c2 = '-';
    83     84     while( fgets(zLine, sizeof(zLine), in) ){
           85  +    if (isFirstline) {
           86  +      static const char bom[] = { 0xEF, 0xBB, 0xBF };
           87  +      if( memcmp(zLine, bom, 3)==0 ) {
           88  +    	  memmove(zLine, zLine+3, sizeof(zLine)-3);
           89  +      }
           90  +      isFirstline = 0;
           91  +    }
    84     92       for(i=0; zLine[i] && isspace(zLine[i]); i++){}
    85     93       if( zLine[i]!='@' ){
    86     94         if( inPrint || inStr ) end_block(out);
    87         -      fprintf(out,"%s",zLine);
           95  +      for(i=0,j=0; zLine[i]; i++){
           96  +        if (128 <= (unsigned char)zLine[i]) {
           97  +          sprintf(&zOut[j], "\\0x%.2X", zLine[i] & 0xFF);
           98  +          j += 5;
           99  +        } else {
          100  +          zOut[j++] = zLine[i];
          101  +        }
          102  +      }
          103  +      zOut[j] = 0;
          104  +      fprintf(out,"%s",zOut);
    88    105                          /* 0123456789 12345 */
    89    106         if( strncmp(zLine, "/* @-comment: ", 14)==0 ){
    90    107           c1 = zLine[14];
    91    108           c2 = zLine[15];
    92    109         }
    93    110         i += strlen(&zLine[i]);
    94    111         while( i>0 && isspace(zLine[i-1]) ){ i--; }
................................................................................
   108    125         if( indent<0 ) indent = 0;
   109    126         omitline = 0;
   110    127         for(j=0; zLine[i] && zLine[i]!='\r' && zLine[i]!='\n'; i++){
   111    128           if( zLine[i]==c1 && (c2==' ' || zLine[i+1]==c2) ){
   112    129              omitline = 1; break; 
   113    130           }
   114    131           if( zLine[i]=='"' || zLine[i]=='\\' ){ zOut[j++] = '\\'; }
   115         -        zOut[j++] = zLine[i];
          132  +        if (128 <= (unsigned char)zLine[i]) {
          133  +          sprintf(&zOut[j], "\\0x%.2X", zLine[i] & 0xFF);
          134  +          j += 5;
          135  +        } else {
          136  +          zOut[j++] = zLine[i];
          137  +        }
   116    138         }
   117    139         while( j>0 && isspace(zOut[j-1]) ){ j--; }
   118    140         zOut[j] = 0;
   119    141         if( j<=0 && omitline ){
   120    142           fprintf(out,"\n");
   121    143         }else{
   122    144           fprintf(out,"%*s\"%s\\n\"\n",indent, "", zOut);
................................................................................
   132    154         int nC;
   133    155         char c;
   134    156         i++;
   135    157         if( isspace(zLine[i]) ){ i++; }
   136    158         indent = i;
   137    159         for(j=0; zLine[i] && zLine[i]!='\r' && zLine[i]!='\n'; i++){
   138    160           if( zLine[i]=='"' || zLine[i]=='\\' ){ zOut[j++] = '\\'; }
   139         -        zOut[j++] = zLine[i];
          161  +        if (128 <= (unsigned char)zLine[i]) {
          162  +          sprintf(&zOut[j], "\\0x%.2X", zLine[i] & 0xFF);
          163  +          j += 5;
          164  +        } else {
          165  +          zOut[j++] = zLine[i];
          166  +        }
   140    167           if( zLine[i]!='%' || zLine[i+1]=='%' || zLine[i+1]==0 ) continue;
   141    168           for(nC=1; zLine[i+nC] && zLine[i+nC]!='('; nC++){}
   142    169           if( zLine[i+nC]!='(' || !isalpha(zLine[i+nC-1]) ) continue;
   143    170           while( --nC ) zOut[j++] = zLine[++i];
   144    171           zArg[nArg++] = ',';
   145    172           k = 0; i++;
   146    173           while( (c = zLine[i])!=0 ){

Changes to src/vfile.c.

    23     23   #include <sys/types.h>
    24     24   #if defined(__DMC__)
    25     25   #include "dirent.h"
    26     26   #else
    27     27   #include <dirent.h>
    28     28   #endif
    29     29   
           30  +#ifndef _WIN32
           31  +#define _WDIR DIR
           32  +#define _wdirent dirent
           33  +#define _wopendir opendir
           34  +#define _wreaddir readdir
           35  +#define _wclosedir closedir
           36  +#define wchar_t char
           37  +#endif
           38  +
    30     39   /*
    31     40   ** The input is guaranteed to be a 40-character well-formed UUID.
    32     41   ** Find its rid.
    33     42   */
    34     43   int fast_uuid_to_rid(const char *zUuid){
    35     44     static Stmt q;
    36     45     int rid;
................................................................................
   379    388   ** Files whose names begin with "." are omitted unless allFlag is true.
   380    389   **
   381    390   ** Any files or directories that match the glob pattern pIgnore are 
   382    391   ** excluded from the scan.  Name matching occurs after the first
   383    392   ** nPrefix characters are elided from the filename.
   384    393   */
   385    394   void vfile_scan(Blob *pPath, int nPrefix, int allFlag, Glob *pIgnore){
   386         -  DIR *d;
          395  +  _WDIR *d;
   387    396     int origSize;
   388    397     const char *zDir;
   389         -  struct dirent *pEntry;
          398  +  struct _wdirent *pEntry;
   390    399     int skipAll = 0;
   391    400     static Stmt ins;
   392    401     static int depth = 0;
   393         -  char *zMbcs;
          402  +  wchar_t *zMbcs;
   394    403   
   395    404     origSize = blob_size(pPath);
   396    405     if( pIgnore ){
   397    406       blob_appendf(pPath, "/");
   398    407       if( glob_match(pIgnore, &blob_str(pPath)[nPrefix+1]) ) skipAll = 1;
   399    408       blob_resize(pPath, origSize);
   400    409     }
................................................................................
   405    414          "INSERT OR IGNORE INTO sfile(x) SELECT :file"
   406    415          "  WHERE NOT EXISTS(SELECT 1 FROM vfile WHERE pathname=:file)"
   407    416       );
   408    417     }
   409    418     depth++;
   410    419   
   411    420     zDir = blob_str(pPath);
   412         -  zMbcs = fossil_utf8_to_mbcs(zDir);
   413         -  d = opendir(zMbcs);
          421  +  zMbcs = fossil_utf8_to_unicode(zDir);
          422  +  d = _wopendir(zMbcs);
   414    423     if( d ){
   415         -    while( (pEntry=readdir(d))!=0 ){
          424  +    while( (pEntry=_wreaddir(d))!=0 ){
   416    425         char *zPath;
   417    426         char *zUtf8;
   418    427         if( pEntry->d_name[0]=='.' ){
   419    428           if( !allFlag ) continue;
   420    429           if( pEntry->d_name[1]==0 ) continue;
   421    430           if( pEntry->d_name[1]=='.' && pEntry->d_name[2]==0 ) continue;
   422    431         }
   423         -      zUtf8 = fossil_mbcs_to_utf8(pEntry->d_name);
          432  +      zUtf8 = fossil_unicode_to_utf8(pEntry->d_name);
   424    433         blob_appendf(pPath, "/%s", zUtf8);
   425    434         fossil_mbcs_free(zUtf8);
   426    435         zPath = blob_str(pPath);
   427    436         if( glob_match(pIgnore, &zPath[nPrefix+1]) ){
   428    437           /* do nothing */
   429    438         }else if( file_wd_isdir(zPath)==1 ){
   430    439           if( !vfile_top_of_checkout(zPath) ){
................................................................................
   433    442         }else if( file_wd_isfile_or_link(zPath) ){
   434    443           db_bind_text(&ins, ":file", &zPath[nPrefix+1]);
   435    444           db_step(&ins);
   436    445           db_reset(&ins);
   437    446         }
   438    447         blob_resize(pPath, origSize);
   439    448       }
   440         -    closedir(d);
          449  +    _wclosedir(d);
   441    450     }
   442    451     fossil_mbcs_free(zMbcs);
   443    452   
   444    453     depth--;
   445    454     if( depth==0 ){
   446    455       db_finalize(&ins);
   447    456     }

Changes to src/wikiformat.c.

     1      1   /*
     2         -** Copyright (c) 2007 D. Richard Hipp
            2  +** Copyright © 2007 D. Richard Hipp
     3      3   **
     4      4   ** This program is free software; you can redistribute it and/or
     5      5   ** modify it under the terms of the Simplified BSD License (also
     6      6   ** known as the "2-Clause License" or "FreeBSD License".)
     7      7   
     8      8   ** This program is distributed in the hope that it will be useful,
     9      9   ** but without any warranty; without even the implied warranty of
................................................................................
  1188   1188         case TOKEN_NEWLINE: {
  1189   1189           blob_append(p->pOut, "\n", 1);
  1190   1190           p->state |= AT_NEWLINE;
  1191   1191           break;
  1192   1192         }
  1193   1193         case TOKEN_BUL_LI: {
  1194   1194           if( inlineOnly ){
  1195         -          blob_append(p->pOut, " &bull; ", -1);
         1195  +          blob_append(p->pOut, " • ", -1);
  1196   1196           }else{
  1197   1197             if( p->wikiList!=MARKUP_UL ){
  1198   1198               if( p->wikiList ){
  1199   1199                 popStackToTag(p, p->wikiList);
  1200   1200               }
  1201   1201               endAutoParagraph(p);
  1202   1202               pushStack(p, MARKUP_UL);
................................................................................
  1408   1408             p->inVerbatim = 1;
  1409   1409             p->preVerbState = p->state;
  1410   1410             p->state &= ~ALLOW_WIKI;
  1411   1411             for (vAttrIdx = 0; vAttrIdx < markup.nAttr; vAttrIdx++){
  1412   1412               if( markup.aAttr[vAttrIdx].iACode == ATTR_ID ){
  1413   1413                 p->zVerbatimId = markup.aAttr[0].zValue;
  1414   1414               }else if( markup.aAttr[vAttrIdx].iACode == ATTR_TYPE ){
  1415         -              blob_appendf(p->pOut, "<pre name='code' class='%s'>",
         1415  +              blob_appendf(p->pOut, "<pre name=\"code\" class=\"%s\">",
  1416   1416                   markup.aAttr[vAttrIdx].zValue);
  1417   1417                 vAttrDidAppend=1;
  1418   1418               }
  1419   1419             }
  1420   1420             if( !vAttrDidAppend ) {
  1421   1421               endAutoParagraph(p);
  1422         -            blob_append(p->pOut, "<pre class='verbatim'>",-1);
         1422  +            blob_append(p->pOut, "<pre class=\"verbatim\">",-1);
  1423   1423             }
  1424   1424             p->wantAutoParagraph = 0;
  1425   1425           }else
  1426   1426           if( markup.iType==MUTYPE_LI ){
  1427   1427             if( backupToType(p, MUTYPE_LIST)==0 ){
  1428   1428               endAutoParagraph(p);
  1429   1429               pushStack(p, MARKUP_UL);