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) → %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\">•</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\">•</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\">•</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\">•</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>•</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>•</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>•</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>•</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 → %s(db_name("repository")) 1621 + @ <p>Database names:<ul><li>repository → %s(db_name("repository")) 1622 1622 if( g.configOpen ){ 1623 - @ <li>config → %s(db_name("configdb")) 1623 + @ <li>config → %s(db_name("configdb")) 1624 1624 } 1625 1625 if( g.localOpen ){ 1626 - @ <li>local-checkout → %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 - @ • 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) 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) → %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) → %h(zFilename) 446 + @ <li> %h(zOldName) → %h(zFilename) 447 447 }else{ 448 448 @ <li> %h(zFilename) 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, " • ", -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);