Fossil SCM

fix for [01a2f3a346]

jan.nijtmans 2012-08-29 11:27 trunk merge
Commit 0357ed556e94ac86aadb4d1c83702fc338afd0ad
+3 -3
--- src/export.c
+++ src/export.c
@@ -1,7 +1,7 @@
11
/*
2
-** Copyright (c) 2010 D. Richard Hipp
2
+** Copyright © 2010 D. Richard Hipp
33
**
44
** This program is free software; you can redistribute it and/or
55
** modify it under the terms of the Simplified BSD License (also
66
** known as the "2-Clause License" or "FreeBSD License".)
77
@@ -136,11 +136,11 @@
136136
if( markfile_in!=0 ){
137137
Stmt qb,qc;
138138
char line[100];
139139
FILE *f;
140140
141
- f = fopen(markfile_in, "r");
141
+ f = fossil_fopen(markfile_in, "r");
142142
if( f==0 ){
143143
fossil_panic("cannot open %s for reading", markfile_in);
144144
}
145145
db_prepare(&qb, "INSERT OR IGNORE INTO oldblob VALUES (:rid)");
146146
db_prepare(&qc, "INSERT OR IGNORE INTO oldcommit VALUES (:rid)");
@@ -325,11 +325,11 @@
325325
db_finalize(&q);
326326
bag_clear(&vers);
327327
328328
if( markfile_out!=0 ){
329329
FILE *f;
330
- f = fopen(markfile_out, "w");
330
+ f = fossil_fopen(markfile_out, "w");
331331
if( f == 0 ){
332332
fossil_panic("cannot open %s for writing", markfile_out);
333333
}
334334
db_prepare(&q, "SELECT rid FROM oldblob");
335335
while( db_step(&q)==SQLITE_ROW ){
336336
--- src/export.c
+++ src/export.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright (c) 2010 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
@@ -136,11 +136,11 @@
136 if( markfile_in!=0 ){
137 Stmt qb,qc;
138 char line[100];
139 FILE *f;
140
141 f = fopen(markfile_in, "r");
142 if( f==0 ){
143 fossil_panic("cannot open %s for reading", markfile_in);
144 }
145 db_prepare(&qb, "INSERT OR IGNORE INTO oldblob VALUES (:rid)");
146 db_prepare(&qc, "INSERT OR IGNORE INTO oldcommit VALUES (:rid)");
@@ -325,11 +325,11 @@
325 db_finalize(&q);
326 bag_clear(&vers);
327
328 if( markfile_out!=0 ){
329 FILE *f;
330 f = fopen(markfile_out, "w");
331 if( f == 0 ){
332 fossil_panic("cannot open %s for writing", markfile_out);
333 }
334 db_prepare(&q, "SELECT rid FROM oldblob");
335 while( db_step(&q)==SQLITE_ROW ){
336
--- src/export.c
+++ src/export.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright © 2010 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
@@ -136,11 +136,11 @@
136 if( markfile_in!=0 ){
137 Stmt qb,qc;
138 char line[100];
139 FILE *f;
140
141 f = fossil_fopen(markfile_in, "r");
142 if( f==0 ){
143 fossil_panic("cannot open %s for reading", markfile_in);
144 }
145 db_prepare(&qb, "INSERT OR IGNORE INTO oldblob VALUES (:rid)");
146 db_prepare(&qc, "INSERT OR IGNORE INTO oldcommit VALUES (:rid)");
@@ -325,11 +325,11 @@
325 db_finalize(&q);
326 bag_clear(&vers);
327
328 if( markfile_out!=0 ){
329 FILE *f;
330 f = fossil_fopen(markfile_out, "w");
331 if( f == 0 ){
332 fossil_panic("cannot open %s for writing", markfile_out);
333 }
334 db_prepare(&q, "SELECT rid FROM oldblob");
335 while( db_step(&q)==SQLITE_ROW ){
336
+3 -3
--- src/export.c
+++ src/export.c
@@ -1,7 +1,7 @@
11
/*
2
-** Copyright (c) 2010 D. Richard Hipp
2
+** Copyright © 2010 D. Richard Hipp
33
**
44
** This program is free software; you can redistribute it and/or
55
** modify it under the terms of the Simplified BSD License (also
66
** known as the "2-Clause License" or "FreeBSD License".)
77
@@ -136,11 +136,11 @@
136136
if( markfile_in!=0 ){
137137
Stmt qb,qc;
138138
char line[100];
139139
FILE *f;
140140
141
- f = fopen(markfile_in, "r");
141
+ f = fossil_fopen(markfile_in, "r");
142142
if( f==0 ){
143143
fossil_panic("cannot open %s for reading", markfile_in);
144144
}
145145
db_prepare(&qb, "INSERT OR IGNORE INTO oldblob VALUES (:rid)");
146146
db_prepare(&qc, "INSERT OR IGNORE INTO oldcommit VALUES (:rid)");
@@ -325,11 +325,11 @@
325325
db_finalize(&q);
326326
bag_clear(&vers);
327327
328328
if( markfile_out!=0 ){
329329
FILE *f;
330
- f = fopen(markfile_out, "w");
330
+ f = fossil_fopen(markfile_out, "w");
331331
if( f == 0 ){
332332
fossil_panic("cannot open %s for writing", markfile_out);
333333
}
334334
db_prepare(&q, "SELECT rid FROM oldblob");
335335
while( db_step(&q)==SQLITE_ROW ){
336336
--- src/export.c
+++ src/export.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright (c) 2010 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
@@ -136,11 +136,11 @@
136 if( markfile_in!=0 ){
137 Stmt qb,qc;
138 char line[100];
139 FILE *f;
140
141 f = fopen(markfile_in, "r");
142 if( f==0 ){
143 fossil_panic("cannot open %s for reading", markfile_in);
144 }
145 db_prepare(&qb, "INSERT OR IGNORE INTO oldblob VALUES (:rid)");
146 db_prepare(&qc, "INSERT OR IGNORE INTO oldcommit VALUES (:rid)");
@@ -325,11 +325,11 @@
325 db_finalize(&q);
326 bag_clear(&vers);
327
328 if( markfile_out!=0 ){
329 FILE *f;
330 f = fopen(markfile_out, "w");
331 if( f == 0 ){
332 fossil_panic("cannot open %s for writing", markfile_out);
333 }
334 db_prepare(&q, "SELECT rid FROM oldblob");
335 while( db_step(&q)==SQLITE_ROW ){
336
--- src/export.c
+++ src/export.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright © 2010 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
@@ -136,11 +136,11 @@
136 if( markfile_in!=0 ){
137 Stmt qb,qc;
138 char line[100];
139 FILE *f;
140
141 f = fossil_fopen(markfile_in, "r");
142 if( f==0 ){
143 fossil_panic("cannot open %s for reading", markfile_in);
144 }
145 db_prepare(&qb, "INSERT OR IGNORE INTO oldblob VALUES (:rid)");
146 db_prepare(&qc, "INSERT OR IGNORE INTO oldcommit VALUES (:rid)");
@@ -325,11 +325,11 @@
325 db_finalize(&q);
326 bag_clear(&vers);
327
328 if( markfile_out!=0 ){
329 FILE *f;
330 f = fossil_fopen(markfile_out, "w");
331 if( f == 0 ){
332 fossil_panic("cannot open %s for writing", markfile_out);
333 }
334 db_prepare(&q, "SELECT rid FROM oldblob");
335 while( db_step(&q)==SQLITE_ROW ){
336
+79 -22
--- src/file.c
+++ src/file.c
@@ -1,7 +1,7 @@
11
/*
2
-** Copyright (c) 2006 D. Richard Hipp
2
+** Copyright © 2006 D. Richard Hipp
33
**
44
** This program is free software; you can redistribute it and/or
55
** modify it under the terms of the Simplified BSD License (also
66
** known as the "2-Clause License" or "FreeBSD License".)
77
@@ -32,10 +32,11 @@
3232
3333
/*
3434
** On Windows, include the Platform SDK header file.
3535
*/
3636
#ifdef _WIN32
37
+# include <direct.h>
3738
# include <windows.h>
3839
#endif
3940
4041
/*
4142
** The file status information from the most recent stat() call.
@@ -68,12 +69,12 @@
6869
}else{
6970
return stat(zFilename, buf);
7071
}
7172
#else
7273
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);
7576
fossil_mbcs_free(zMbcs);
7677
return rc;
7778
#endif
7879
}
7980
@@ -298,13 +299,17 @@
298299
299300
/*
300301
** Wrapper around the access() system call.
301302
*/
302303
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);
305307
fossil_mbcs_free(zMbcs);
308
+#else
309
+ int rc = access(zFilename, flags);
310
+#endif
306311
return rc;
307312
}
308313
309314
/*
310315
** Find an unused filename similar to zBase with zSuffix appended.
@@ -389,13 +394,17 @@
389394
390395
/*
391396
** Delete a file.
392397
*/
393398
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);
396402
fossil_mbcs_free(z);
403
+#else
404
+ unlink(zFilename);
405
+#endif
397406
}
398407
399408
/*
400409
** Create the directory named in the argument, if it does not already
401410
** exist. If forceFlag is 1, delete any prior non-directory object
@@ -410,12 +419,12 @@
410419
file_delete(zName);
411420
}
412421
if( rc!=1 ){
413422
#if defined(_WIN32)
414423
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);
417426
fossil_mbcs_free(zMbcs);
418427
return rc;
419428
#else
420429
return mkdir(zName, 0755);
421430
#endif
@@ -561,24 +570,24 @@
561570
}
562571
563572
/*
564573
** Get the current working directory.
565574
**
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 '\\'
567576
** characters are converted to '/'. No conversions are needed on
568577
** unix.
569578
*/
570579
void file_getcwd(char *zBuf, int nBuf){
571580
#ifdef _WIN32
572581
char *zPwdUtf8;
573582
int nPwd;
574583
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 ){
577586
fossil_fatal("cannot find the current working directory.");
578587
}
579
- zPwdUtf8 = fossil_mbcs_to_utf8(zPwd);
588
+ zPwdUtf8 = fossil_unicode_to_utf8(zPwd);
580589
nPwd = strlen(zPwdUtf8);
581590
if( nPwd > nBuf-1 ){
582591
fossil_fatal("pwd too big: max %d\n", nBuf-1);
583592
}
584593
for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/';
@@ -928,14 +937,14 @@
928937
unsigned int i, j;
929938
const char *zDir = ".";
930939
int cnt = 0;
931940
932941
#if defined(_WIN32)
933
- char zTmpPath[MAX_PATH];
942
+ wchar_t zTmpPath[MAX_PATH];
934943
935
- if( GetTempPath(sizeof(zTmpPath), zTmpPath) ){
936
- azDirs[0] = zTmpPath;
944
+ if( GetTempPathW(MAX_PATH, zTmpPath) ){
945
+ azDirs[0] = fossil_unicode_to_utf8(zTmpPath);
937946
}
938947
939948
azDirs[1] = fossil_getenv("TEMP");
940949
azDirs[2] = fossil_getenv("TMP");
941950
#endif
@@ -1014,10 +1023,29 @@
10141023
return sqlite3_win32_mbcs_to_utf8(zMbcs);
10151024
#else
10161025
return (char*)zMbcs; /* No-op on unix */
10171026
#endif
10181027
}
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
+}
10191047
10201048
/*
10211049
** Translate UTF8 to MBCS for use in system calls. Return a pointer to the
10221050
** translated text.. Call fossil_mbcs_free() to deallocate any memory
10231051
** used to store the returned pointer when done.
@@ -1028,18 +1056,41 @@
10281056
return sqlite3_win32_utf8_to_mbcs(zUtf8);
10291057
#else
10301058
return (char*)zUtf8; /* No-op on unix */
10311059
#endif
10321060
}
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
+}
10331080
10341081
/*
10351082
** Return the value of an environment variable as UTF8.
10361083
*/
10371084
char *fossil_getenv(const char *zName){
1038
- char *zValue = getenv(zName);
10391085
#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);
10411092
#endif
10421093
return zValue;
10431094
}
10441095
10451096
/*
@@ -1085,11 +1136,11 @@
10851136
10861137
/*
10871138
** Translate MBCS to UTF8. Return a pointer. Call fossil_mbcs_free()
10881139
** to deallocate any memory used to store the returned pointer when done.
10891140
*/
1090
-void fossil_mbcs_free(char *zOld){
1141
+void fossil_mbcs_free(void *zOld){
10911142
#ifdef _WIN32
10921143
extern void sqlite3_free(void*);
10931144
sqlite3_free(zOld);
10941145
#else
10951146
/* No-op on unix */
@@ -1098,10 +1149,16 @@
10981149
10991150
/*
11001151
** Like fopen() but always takes a UTF8 argument.
11011152
*/
11021153
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
11061163
return f;
11071164
}
11081165
--- src/file.c
+++ src/file.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright (c) 2006 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
@@ -32,10 +32,11 @@
32
33 /*
34 ** On Windows, include the Platform SDK header file.
35 */
36 #ifdef _WIN32
 
37 # include <windows.h>
38 #endif
39
40 /*
41 ** The file status information from the most recent stat() call.
@@ -68,12 +69,12 @@
68 }else{
69 return stat(zFilename, buf);
70 }
71 #else
72 int rc = 0;
73 char *zMbcs = fossil_utf8_to_mbcs(zFilename);
74 rc = stat(zMbcs, buf);
75 fossil_mbcs_free(zMbcs);
76 return rc;
77 #endif
78 }
79
@@ -298,13 +299,17 @@
298
299 /*
300 ** Wrapper around the access() system call.
301 */
302 int file_access(const char *zFilename, int flags){
303 char *zMbcs = fossil_utf8_to_mbcs(zFilename);
304 int rc = access(zMbcs, flags);
 
305 fossil_mbcs_free(zMbcs);
 
 
 
306 return rc;
307 }
308
309 /*
310 ** Find an unused filename similar to zBase with zSuffix appended.
@@ -389,13 +394,17 @@
389
390 /*
391 ** Delete a file.
392 */
393 void file_delete(const char *zFilename){
394 char *z = fossil_utf8_to_mbcs(zFilename);
395 unlink(z);
 
396 fossil_mbcs_free(z);
 
 
 
397 }
398
399 /*
400 ** Create the directory named in the argument, if it does not already
401 ** exist. If forceFlag is 1, delete any prior non-directory object
@@ -410,12 +419,12 @@
410 file_delete(zName);
411 }
412 if( rc!=1 ){
413 #if defined(_WIN32)
414 int rc;
415 char *zMbcs = fossil_utf8_to_mbcs(zName);
416 rc = mkdir(zMbcs);
417 fossil_mbcs_free(zMbcs);
418 return rc;
419 #else
420 return mkdir(zName, 0755);
421 #endif
@@ -561,24 +570,24 @@
561 }
562
563 /*
564 ** Get the current working directory.
565 **
566 ** On windows, the name is converted from MBCS to UTF8 and all '\\'
567 ** characters are converted to '/'. No conversions are needed on
568 ** unix.
569 */
570 void file_getcwd(char *zBuf, int nBuf){
571 #ifdef _WIN32
572 char *zPwdUtf8;
573 int nPwd;
574 int i;
575 char zPwd[2000];
576 if( getcwd(zPwd, sizeof(zPwd)-1)==0 ){
577 fossil_fatal("cannot find the current working directory.");
578 }
579 zPwdUtf8 = fossil_mbcs_to_utf8(zPwd);
580 nPwd = strlen(zPwdUtf8);
581 if( nPwd > nBuf-1 ){
582 fossil_fatal("pwd too big: max %d\n", nBuf-1);
583 }
584 for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/';
@@ -928,14 +937,14 @@
928 unsigned int i, j;
929 const char *zDir = ".";
930 int cnt = 0;
931
932 #if defined(_WIN32)
933 char zTmpPath[MAX_PATH];
934
935 if( GetTempPath(sizeof(zTmpPath), zTmpPath) ){
936 azDirs[0] = zTmpPath;
937 }
938
939 azDirs[1] = fossil_getenv("TEMP");
940 azDirs[2] = fossil_getenv("TMP");
941 #endif
@@ -1014,10 +1023,29 @@
1014 return sqlite3_win32_mbcs_to_utf8(zMbcs);
1015 #else
1016 return (char*)zMbcs; /* No-op on unix */
1017 #endif
1018 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1019
1020 /*
1021 ** Translate UTF8 to MBCS for use in system calls. Return a pointer to the
1022 ** translated text.. Call fossil_mbcs_free() to deallocate any memory
1023 ** used to store the returned pointer when done.
@@ -1028,18 +1056,41 @@
1028 return sqlite3_win32_utf8_to_mbcs(zUtf8);
1029 #else
1030 return (char*)zUtf8; /* No-op on unix */
1031 #endif
1032 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1033
1034 /*
1035 ** Return the value of an environment variable as UTF8.
1036 */
1037 char *fossil_getenv(const char *zName){
1038 char *zValue = getenv(zName);
1039 #ifdef _WIN32
1040 if( zValue ) zValue = fossil_mbcs_to_utf8(zValue);
 
 
 
 
 
1041 #endif
1042 return zValue;
1043 }
1044
1045 /*
@@ -1085,11 +1136,11 @@
1085
1086 /*
1087 ** Translate MBCS to UTF8. Return a pointer. Call fossil_mbcs_free()
1088 ** to deallocate any memory used to store the returned pointer when done.
1089 */
1090 void fossil_mbcs_free(char *zOld){
1091 #ifdef _WIN32
1092 extern void sqlite3_free(void*);
1093 sqlite3_free(zOld);
1094 #else
1095 /* No-op on unix */
@@ -1098,10 +1149,16 @@
1098
1099 /*
1100 ** Like fopen() but always takes a UTF8 argument.
1101 */
1102 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);
 
 
 
 
 
 
1106 return f;
1107 }
1108
--- src/file.c
+++ src/file.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright © 2006 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
@@ -32,10 +32,11 @@
32
33 /*
34 ** On Windows, include the Platform SDK header file.
35 */
36 #ifdef _WIN32
37 # include <direct.h>
38 # include <windows.h>
39 #endif
40
41 /*
42 ** The file status information from the most recent stat() call.
@@ -68,12 +69,12 @@
69 }else{
70 return stat(zFilename, buf);
71 }
72 #else
73 int rc = 0;
74 wchar_t *zMbcs = fossil_utf8_to_unicode(zFilename);
75 rc = _wstati64(zMbcs, buf);
76 fossil_mbcs_free(zMbcs);
77 return rc;
78 #endif
79 }
80
@@ -298,13 +299,17 @@
299
300 /*
301 ** Wrapper around the access() system call.
302 */
303 int file_access(const char *zFilename, int flags){
304 #ifdef _WIN32
305 wchar_t *zMbcs = fossil_utf8_to_unicode(zFilename);
306 int rc = _waccess(zMbcs, flags);
307 fossil_mbcs_free(zMbcs);
308 #else
309 int rc = access(zFilename, flags);
310 #endif
311 return rc;
312 }
313
314 /*
315 ** Find an unused filename similar to zBase with zSuffix appended.
@@ -389,13 +394,17 @@
394
395 /*
396 ** Delete a file.
397 */
398 void file_delete(const char *zFilename){
399 #ifdef _WIN32
400 wchar_t *z = fossil_utf8_to_unicode(zFilename);
401 _wunlink(z);
402 fossil_mbcs_free(z);
403 #else
404 unlink(zFilename);
405 #endif
406 }
407
408 /*
409 ** Create the directory named in the argument, if it does not already
410 ** exist. If forceFlag is 1, delete any prior non-directory object
@@ -410,12 +419,12 @@
419 file_delete(zName);
420 }
421 if( rc!=1 ){
422 #if defined(_WIN32)
423 int rc;
424 wchar_t *zMbcs = fossil_utf8_to_unicode(zName);
425 rc = _wmkdir(zMbcs);
426 fossil_mbcs_free(zMbcs);
427 return rc;
428 #else
429 return mkdir(zName, 0755);
430 #endif
@@ -561,24 +570,24 @@
570 }
571
572 /*
573 ** Get the current working directory.
574 **
575 ** On windows, the name is converted from unicode to UTF8 and all '\\'
576 ** characters are converted to '/'. No conversions are needed on
577 ** unix.
578 */
579 void file_getcwd(char *zBuf, int nBuf){
580 #ifdef _WIN32
581 char *zPwdUtf8;
582 int nPwd;
583 int i;
584 wchar_t zPwd[2000];
585 if( _wgetcwd(zPwd, sizeof(zPwd)-1)==0 ){
586 fossil_fatal("cannot find the current working directory.");
587 }
588 zPwdUtf8 = fossil_unicode_to_utf8(zPwd);
589 nPwd = strlen(zPwdUtf8);
590 if( nPwd > nBuf-1 ){
591 fossil_fatal("pwd too big: max %d\n", nBuf-1);
592 }
593 for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/';
@@ -928,14 +937,14 @@
937 unsigned int i, j;
938 const char *zDir = ".";
939 int cnt = 0;
940
941 #if defined(_WIN32)
942 wchar_t zTmpPath[MAX_PATH];
943
944 if( GetTempPathW(MAX_PATH, zTmpPath) ){
945 azDirs[0] = fossil_unicode_to_utf8(zTmpPath);
946 }
947
948 azDirs[1] = fossil_getenv("TEMP");
949 azDirs[2] = fossil_getenv("TMP");
950 #endif
@@ -1014,10 +1023,29 @@
1023 return sqlite3_win32_mbcs_to_utf8(zMbcs);
1024 #else
1025 return (char*)zMbcs; /* No-op on unix */
1026 #endif
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 }
1047
1048 /*
1049 ** Translate UTF8 to MBCS for use in system calls. Return a pointer to the
1050 ** translated text.. Call fossil_mbcs_free() to deallocate any memory
1051 ** used to store the returned pointer when done.
@@ -1028,18 +1056,41 @@
1056 return sqlite3_win32_utf8_to_mbcs(zUtf8);
1057 #else
1058 return (char*)zUtf8; /* No-op on unix */
1059 #endif
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 }
1080
1081 /*
1082 ** Return the value of an environment variable as UTF8.
1083 */
1084 char *fossil_getenv(const char *zName){
 
1085 #ifdef _WIN32
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);
1092 #endif
1093 return zValue;
1094 }
1095
1096 /*
@@ -1085,11 +1136,11 @@
1136
1137 /*
1138 ** Translate MBCS to UTF8. Return a pointer. Call fossil_mbcs_free()
1139 ** to deallocate any memory used to store the returned pointer when done.
1140 */
1141 void fossil_mbcs_free(void *zOld){
1142 #ifdef _WIN32
1143 extern void sqlite3_free(void*);
1144 sqlite3_free(zOld);
1145 #else
1146 /* No-op on unix */
@@ -1098,10 +1149,16 @@
1149
1150 /*
1151 ** Like fopen() but always takes a UTF8 argument.
1152 */
1153 FILE *fossil_fopen(const char *zName, const char *zMode){
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
1163 return f;
1164 }
1165
+79 -22
--- src/file.c
+++ src/file.c
@@ -1,7 +1,7 @@
11
/*
2
-** Copyright (c) 2006 D. Richard Hipp
2
+** Copyright © 2006 D. Richard Hipp
33
**
44
** This program is free software; you can redistribute it and/or
55
** modify it under the terms of the Simplified BSD License (also
66
** known as the "2-Clause License" or "FreeBSD License".)
77
@@ -32,10 +32,11 @@
3232
3333
/*
3434
** On Windows, include the Platform SDK header file.
3535
*/
3636
#ifdef _WIN32
37
+# include <direct.h>
3738
# include <windows.h>
3839
#endif
3940
4041
/*
4142
** The file status information from the most recent stat() call.
@@ -68,12 +69,12 @@
6869
}else{
6970
return stat(zFilename, buf);
7071
}
7172
#else
7273
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);
7576
fossil_mbcs_free(zMbcs);
7677
return rc;
7778
#endif
7879
}
7980
@@ -298,13 +299,17 @@
298299
299300
/*
300301
** Wrapper around the access() system call.
301302
*/
302303
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);
305307
fossil_mbcs_free(zMbcs);
308
+#else
309
+ int rc = access(zFilename, flags);
310
+#endif
306311
return rc;
307312
}
308313
309314
/*
310315
** Find an unused filename similar to zBase with zSuffix appended.
@@ -389,13 +394,17 @@
389394
390395
/*
391396
** Delete a file.
392397
*/
393398
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);
396402
fossil_mbcs_free(z);
403
+#else
404
+ unlink(zFilename);
405
+#endif
397406
}
398407
399408
/*
400409
** Create the directory named in the argument, if it does not already
401410
** exist. If forceFlag is 1, delete any prior non-directory object
@@ -410,12 +419,12 @@
410419
file_delete(zName);
411420
}
412421
if( rc!=1 ){
413422
#if defined(_WIN32)
414423
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);
417426
fossil_mbcs_free(zMbcs);
418427
return rc;
419428
#else
420429
return mkdir(zName, 0755);
421430
#endif
@@ -561,24 +570,24 @@
561570
}
562571
563572
/*
564573
** Get the current working directory.
565574
**
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 '\\'
567576
** characters are converted to '/'. No conversions are needed on
568577
** unix.
569578
*/
570579
void file_getcwd(char *zBuf, int nBuf){
571580
#ifdef _WIN32
572581
char *zPwdUtf8;
573582
int nPwd;
574583
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 ){
577586
fossil_fatal("cannot find the current working directory.");
578587
}
579
- zPwdUtf8 = fossil_mbcs_to_utf8(zPwd);
588
+ zPwdUtf8 = fossil_unicode_to_utf8(zPwd);
580589
nPwd = strlen(zPwdUtf8);
581590
if( nPwd > nBuf-1 ){
582591
fossil_fatal("pwd too big: max %d\n", nBuf-1);
583592
}
584593
for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/';
@@ -928,14 +937,14 @@
928937
unsigned int i, j;
929938
const char *zDir = ".";
930939
int cnt = 0;
931940
932941
#if defined(_WIN32)
933
- char zTmpPath[MAX_PATH];
942
+ wchar_t zTmpPath[MAX_PATH];
934943
935
- if( GetTempPath(sizeof(zTmpPath), zTmpPath) ){
936
- azDirs[0] = zTmpPath;
944
+ if( GetTempPathW(MAX_PATH, zTmpPath) ){
945
+ azDirs[0] = fossil_unicode_to_utf8(zTmpPath);
937946
}
938947
939948
azDirs[1] = fossil_getenv("TEMP");
940949
azDirs[2] = fossil_getenv("TMP");
941950
#endif
@@ -1014,10 +1023,29 @@
10141023
return sqlite3_win32_mbcs_to_utf8(zMbcs);
10151024
#else
10161025
return (char*)zMbcs; /* No-op on unix */
10171026
#endif
10181027
}
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
+}
10191047
10201048
/*
10211049
** Translate UTF8 to MBCS for use in system calls. Return a pointer to the
10221050
** translated text.. Call fossil_mbcs_free() to deallocate any memory
10231051
** used to store the returned pointer when done.
@@ -1028,18 +1056,41 @@
10281056
return sqlite3_win32_utf8_to_mbcs(zUtf8);
10291057
#else
10301058
return (char*)zUtf8; /* No-op on unix */
10311059
#endif
10321060
}
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
+}
10331080
10341081
/*
10351082
** Return the value of an environment variable as UTF8.
10361083
*/
10371084
char *fossil_getenv(const char *zName){
1038
- char *zValue = getenv(zName);
10391085
#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);
10411092
#endif
10421093
return zValue;
10431094
}
10441095
10451096
/*
@@ -1085,11 +1136,11 @@
10851136
10861137
/*
10871138
** Translate MBCS to UTF8. Return a pointer. Call fossil_mbcs_free()
10881139
** to deallocate any memory used to store the returned pointer when done.
10891140
*/
1090
-void fossil_mbcs_free(char *zOld){
1141
+void fossil_mbcs_free(void *zOld){
10911142
#ifdef _WIN32
10921143
extern void sqlite3_free(void*);
10931144
sqlite3_free(zOld);
10941145
#else
10951146
/* No-op on unix */
@@ -1098,10 +1149,16 @@
10981149
10991150
/*
11001151
** Like fopen() but always takes a UTF8 argument.
11011152
*/
11021153
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
11061163
return f;
11071164
}
11081165
--- src/file.c
+++ src/file.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright (c) 2006 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
@@ -32,10 +32,11 @@
32
33 /*
34 ** On Windows, include the Platform SDK header file.
35 */
36 #ifdef _WIN32
 
37 # include <windows.h>
38 #endif
39
40 /*
41 ** The file status information from the most recent stat() call.
@@ -68,12 +69,12 @@
68 }else{
69 return stat(zFilename, buf);
70 }
71 #else
72 int rc = 0;
73 char *zMbcs = fossil_utf8_to_mbcs(zFilename);
74 rc = stat(zMbcs, buf);
75 fossil_mbcs_free(zMbcs);
76 return rc;
77 #endif
78 }
79
@@ -298,13 +299,17 @@
298
299 /*
300 ** Wrapper around the access() system call.
301 */
302 int file_access(const char *zFilename, int flags){
303 char *zMbcs = fossil_utf8_to_mbcs(zFilename);
304 int rc = access(zMbcs, flags);
 
305 fossil_mbcs_free(zMbcs);
 
 
 
306 return rc;
307 }
308
309 /*
310 ** Find an unused filename similar to zBase with zSuffix appended.
@@ -389,13 +394,17 @@
389
390 /*
391 ** Delete a file.
392 */
393 void file_delete(const char *zFilename){
394 char *z = fossil_utf8_to_mbcs(zFilename);
395 unlink(z);
 
396 fossil_mbcs_free(z);
 
 
 
397 }
398
399 /*
400 ** Create the directory named in the argument, if it does not already
401 ** exist. If forceFlag is 1, delete any prior non-directory object
@@ -410,12 +419,12 @@
410 file_delete(zName);
411 }
412 if( rc!=1 ){
413 #if defined(_WIN32)
414 int rc;
415 char *zMbcs = fossil_utf8_to_mbcs(zName);
416 rc = mkdir(zMbcs);
417 fossil_mbcs_free(zMbcs);
418 return rc;
419 #else
420 return mkdir(zName, 0755);
421 #endif
@@ -561,24 +570,24 @@
561 }
562
563 /*
564 ** Get the current working directory.
565 **
566 ** On windows, the name is converted from MBCS to UTF8 and all '\\'
567 ** characters are converted to '/'. No conversions are needed on
568 ** unix.
569 */
570 void file_getcwd(char *zBuf, int nBuf){
571 #ifdef _WIN32
572 char *zPwdUtf8;
573 int nPwd;
574 int i;
575 char zPwd[2000];
576 if( getcwd(zPwd, sizeof(zPwd)-1)==0 ){
577 fossil_fatal("cannot find the current working directory.");
578 }
579 zPwdUtf8 = fossil_mbcs_to_utf8(zPwd);
580 nPwd = strlen(zPwdUtf8);
581 if( nPwd > nBuf-1 ){
582 fossil_fatal("pwd too big: max %d\n", nBuf-1);
583 }
584 for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/';
@@ -928,14 +937,14 @@
928 unsigned int i, j;
929 const char *zDir = ".";
930 int cnt = 0;
931
932 #if defined(_WIN32)
933 char zTmpPath[MAX_PATH];
934
935 if( GetTempPath(sizeof(zTmpPath), zTmpPath) ){
936 azDirs[0] = zTmpPath;
937 }
938
939 azDirs[1] = fossil_getenv("TEMP");
940 azDirs[2] = fossil_getenv("TMP");
941 #endif
@@ -1014,10 +1023,29 @@
1014 return sqlite3_win32_mbcs_to_utf8(zMbcs);
1015 #else
1016 return (char*)zMbcs; /* No-op on unix */
1017 #endif
1018 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1019
1020 /*
1021 ** Translate UTF8 to MBCS for use in system calls. Return a pointer to the
1022 ** translated text.. Call fossil_mbcs_free() to deallocate any memory
1023 ** used to store the returned pointer when done.
@@ -1028,18 +1056,41 @@
1028 return sqlite3_win32_utf8_to_mbcs(zUtf8);
1029 #else
1030 return (char*)zUtf8; /* No-op on unix */
1031 #endif
1032 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1033
1034 /*
1035 ** Return the value of an environment variable as UTF8.
1036 */
1037 char *fossil_getenv(const char *zName){
1038 char *zValue = getenv(zName);
1039 #ifdef _WIN32
1040 if( zValue ) zValue = fossil_mbcs_to_utf8(zValue);
 
 
 
 
 
1041 #endif
1042 return zValue;
1043 }
1044
1045 /*
@@ -1085,11 +1136,11 @@
1085
1086 /*
1087 ** Translate MBCS to UTF8. Return a pointer. Call fossil_mbcs_free()
1088 ** to deallocate any memory used to store the returned pointer when done.
1089 */
1090 void fossil_mbcs_free(char *zOld){
1091 #ifdef _WIN32
1092 extern void sqlite3_free(void*);
1093 sqlite3_free(zOld);
1094 #else
1095 /* No-op on unix */
@@ -1098,10 +1149,16 @@
1098
1099 /*
1100 ** Like fopen() but always takes a UTF8 argument.
1101 */
1102 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);
 
 
 
 
 
 
1106 return f;
1107 }
1108
--- src/file.c
+++ src/file.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright © 2006 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
@@ -32,10 +32,11 @@
32
33 /*
34 ** On Windows, include the Platform SDK header file.
35 */
36 #ifdef _WIN32
37 # include <direct.h>
38 # include <windows.h>
39 #endif
40
41 /*
42 ** The file status information from the most recent stat() call.
@@ -68,12 +69,12 @@
69 }else{
70 return stat(zFilename, buf);
71 }
72 #else
73 int rc = 0;
74 wchar_t *zMbcs = fossil_utf8_to_unicode(zFilename);
75 rc = _wstati64(zMbcs, buf);
76 fossil_mbcs_free(zMbcs);
77 return rc;
78 #endif
79 }
80
@@ -298,13 +299,17 @@
299
300 /*
301 ** Wrapper around the access() system call.
302 */
303 int file_access(const char *zFilename, int flags){
304 #ifdef _WIN32
305 wchar_t *zMbcs = fossil_utf8_to_unicode(zFilename);
306 int rc = _waccess(zMbcs, flags);
307 fossil_mbcs_free(zMbcs);
308 #else
309 int rc = access(zFilename, flags);
310 #endif
311 return rc;
312 }
313
314 /*
315 ** Find an unused filename similar to zBase with zSuffix appended.
@@ -389,13 +394,17 @@
394
395 /*
396 ** Delete a file.
397 */
398 void file_delete(const char *zFilename){
399 #ifdef _WIN32
400 wchar_t *z = fossil_utf8_to_unicode(zFilename);
401 _wunlink(z);
402 fossil_mbcs_free(z);
403 #else
404 unlink(zFilename);
405 #endif
406 }
407
408 /*
409 ** Create the directory named in the argument, if it does not already
410 ** exist. If forceFlag is 1, delete any prior non-directory object
@@ -410,12 +419,12 @@
419 file_delete(zName);
420 }
421 if( rc!=1 ){
422 #if defined(_WIN32)
423 int rc;
424 wchar_t *zMbcs = fossil_utf8_to_unicode(zName);
425 rc = _wmkdir(zMbcs);
426 fossil_mbcs_free(zMbcs);
427 return rc;
428 #else
429 return mkdir(zName, 0755);
430 #endif
@@ -561,24 +570,24 @@
570 }
571
572 /*
573 ** Get the current working directory.
574 **
575 ** On windows, the name is converted from unicode to UTF8 and all '\\'
576 ** characters are converted to '/'. No conversions are needed on
577 ** unix.
578 */
579 void file_getcwd(char *zBuf, int nBuf){
580 #ifdef _WIN32
581 char *zPwdUtf8;
582 int nPwd;
583 int i;
584 wchar_t zPwd[2000];
585 if( _wgetcwd(zPwd, sizeof(zPwd)-1)==0 ){
586 fossil_fatal("cannot find the current working directory.");
587 }
588 zPwdUtf8 = fossil_unicode_to_utf8(zPwd);
589 nPwd = strlen(zPwdUtf8);
590 if( nPwd > nBuf-1 ){
591 fossil_fatal("pwd too big: max %d\n", nBuf-1);
592 }
593 for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/';
@@ -928,14 +937,14 @@
937 unsigned int i, j;
938 const char *zDir = ".";
939 int cnt = 0;
940
941 #if defined(_WIN32)
942 wchar_t zTmpPath[MAX_PATH];
943
944 if( GetTempPathW(MAX_PATH, zTmpPath) ){
945 azDirs[0] = fossil_unicode_to_utf8(zTmpPath);
946 }
947
948 azDirs[1] = fossil_getenv("TEMP");
949 azDirs[2] = fossil_getenv("TMP");
950 #endif
@@ -1014,10 +1023,29 @@
1023 return sqlite3_win32_mbcs_to_utf8(zMbcs);
1024 #else
1025 return (char*)zMbcs; /* No-op on unix */
1026 #endif
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 }
1047
1048 /*
1049 ** Translate UTF8 to MBCS for use in system calls. Return a pointer to the
1050 ** translated text.. Call fossil_mbcs_free() to deallocate any memory
1051 ** used to store the returned pointer when done.
@@ -1028,18 +1056,41 @@
1056 return sqlite3_win32_utf8_to_mbcs(zUtf8);
1057 #else
1058 return (char*)zUtf8; /* No-op on unix */
1059 #endif
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 }
1080
1081 /*
1082 ** Return the value of an environment variable as UTF8.
1083 */
1084 char *fossil_getenv(const char *zName){
 
1085 #ifdef _WIN32
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);
1092 #endif
1093 return zValue;
1094 }
1095
1096 /*
@@ -1085,11 +1136,11 @@
1136
1137 /*
1138 ** Translate MBCS to UTF8. Return a pointer. Call fossil_mbcs_free()
1139 ** to deallocate any memory used to store the returned pointer when done.
1140 */
1141 void fossil_mbcs_free(void *zOld){
1142 #ifdef _WIN32
1143 extern void sqlite3_free(void*);
1144 sqlite3_free(zOld);
1145 #else
1146 /* No-op on unix */
@@ -1098,10 +1149,16 @@
1149
1150 /*
1151 ** Like fopen() but always takes a UTF8 argument.
1152 */
1153 FILE *fossil_fopen(const char *zName, const char *zMode){
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
1163 return f;
1164 }
1165
+2 -2
--- src/import.c
+++ src/import.c
@@ -1,7 +1,7 @@
11
/*
2
-** Copyright (c) 2010 D. Richard Hipp
2
+** Copyright © 2010 D. Richard Hipp
33
**
44
** This program is free software; you can redistribute it and/or
55
** modify it under the terms of the Simplified BSD License (also
66
** known as the "2-Clause License" or "FreeBSD License".)
77
@@ -732,11 +732,11 @@
732732
verify_all_options();
733733
if( g.argc!=3 && g.argc!=4 ){
734734
usage("REPOSITORY-NAME");
735735
}
736736
if( g.argc==4 ){
737
- pIn = fopen(g.argv[3], "rb");
737
+ pIn = fossil_fopen(g.argv[3], "rb");
738738
}else{
739739
pIn = stdin;
740740
fossil_binary_mode(pIn);
741741
}
742742
if( !incrFlag ){
743743
--- src/import.c
+++ src/import.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright (c) 2010 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
@@ -732,11 +732,11 @@
732 verify_all_options();
733 if( g.argc!=3 && g.argc!=4 ){
734 usage("REPOSITORY-NAME");
735 }
736 if( g.argc==4 ){
737 pIn = fopen(g.argv[3], "rb");
738 }else{
739 pIn = stdin;
740 fossil_binary_mode(pIn);
741 }
742 if( !incrFlag ){
743
--- src/import.c
+++ src/import.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright © 2010 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
@@ -732,11 +732,11 @@
732 verify_all_options();
733 if( g.argc!=3 && g.argc!=4 ){
734 usage("REPOSITORY-NAME");
735 }
736 if( g.argc==4 ){
737 pIn = fossil_fopen(g.argv[3], "rb");
738 }else{
739 pIn = stdin;
740 fossil_binary_mode(pIn);
741 }
742 if( !incrFlag ){
743
+2 -2
--- src/import.c
+++ src/import.c
@@ -1,7 +1,7 @@
11
/*
2
-** Copyright (c) 2010 D. Richard Hipp
2
+** Copyright © 2010 D. Richard Hipp
33
**
44
** This program is free software; you can redistribute it and/or
55
** modify it under the terms of the Simplified BSD License (also
66
** known as the "2-Clause License" or "FreeBSD License".)
77
@@ -732,11 +732,11 @@
732732
verify_all_options();
733733
if( g.argc!=3 && g.argc!=4 ){
734734
usage("REPOSITORY-NAME");
735735
}
736736
if( g.argc==4 ){
737
- pIn = fopen(g.argv[3], "rb");
737
+ pIn = fossil_fopen(g.argv[3], "rb");
738738
}else{
739739
pIn = stdin;
740740
fossil_binary_mode(pIn);
741741
}
742742
if( !incrFlag ){
743743
--- src/import.c
+++ src/import.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright (c) 2010 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
@@ -732,11 +732,11 @@
732 verify_all_options();
733 if( g.argc!=3 && g.argc!=4 ){
734 usage("REPOSITORY-NAME");
735 }
736 if( g.argc==4 ){
737 pIn = fopen(g.argv[3], "rb");
738 }else{
739 pIn = stdin;
740 fossil_binary_mode(pIn);
741 }
742 if( !incrFlag ){
743
--- src/import.c
+++ src/import.c
@@ -1,7 +1,7 @@
1 /*
2 ** Copyright © 2010 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
@@ -732,11 +732,11 @@
732 verify_all_options();
733 if( g.argc!=3 && g.argc!=4 ){
734 usage("REPOSITORY-NAME");
735 }
736 if( g.argc==4 ){
737 pIn = fossil_fopen(g.argv[3], "rb");
738 }else{
739 pIn = stdin;
740 fossil_binary_mode(pIn);
741 }
742 if( !incrFlag ){
743
+17 -8
--- src/rebuild.c
+++ src/rebuild.c
@@ -21,10 +21,19 @@
2121
#include "rebuild.h"
2222
#include <assert.h>
2323
#include <dirent.h>
2424
#include <errno.h>
2525
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
+
2635
/*
2736
** Make changes to the stable part of the schema (the part that is not
2837
** simply deleted and reconstructed on a rebuild) to bring the schema
2938
** up to the latest.
3039
*/
@@ -818,28 +827,28 @@
818827
/*
819828
** Recursively read all files from the directory zPath and install
820829
** every file read as a new artifact in the repository.
821830
*/
822831
void recon_read_dir(char *zPath){
823
- DIR *d;
824
- struct dirent *pEntry;
832
+ _WDIR *d;
833
+ struct _wdirent *pEntry;
825834
Blob aContent; /* content of the just read artifact */
826835
static int nFileRead = 0;
827
- char *zMbcsPath;
836
+ wchar_t *zMbcsPath;
828837
char *zUtf8Name;
829838
830
- zMbcsPath = fossil_utf8_to_mbcs(zPath);
831
- d = opendir(zMbcsPath);
839
+ zMbcsPath = fossil_utf8_to_unicode(zPath);
840
+ d = _wopendir(zMbcsPath);
832841
if( d ){
833
- while( (pEntry=readdir(d))!=0 ){
842
+ while( (pEntry=_wreaddir(d))!=0 ){
834843
Blob path;
835844
char *zSubpath;
836845
837846
if( pEntry->d_name[0]=='.' ){
838847
continue;
839848
}
840
- zUtf8Name = fossil_mbcs_to_utf8(pEntry->d_name);
849
+ zUtf8Name = fossil_unicode_to_utf8(pEntry->d_name);
841850
zSubpath = mprintf("%s/%s", zPath, zUtf8Name);
842851
fossil_mbcs_free(zUtf8Name);
843852
if( file_isdir(zSubpath)==1 ){
844853
recon_read_dir(zSubpath);
845854
}
@@ -854,11 +863,11 @@
854863
blob_reset(&aContent);
855864
free(zSubpath);
856865
fossil_print("\r%d", ++nFileRead);
857866
fflush(stdout);
858867
}
859
- closedir(d);
868
+ _wclosedir(d);
860869
}else {
861870
fossil_panic("encountered error %d while trying to open \"%s\".",
862871
errno, g.argv[3]);
863872
}
864873
fossil_mbcs_free(zMbcsPath);
865874
--- src/rebuild.c
+++ src/rebuild.c
@@ -21,10 +21,19 @@
21 #include "rebuild.h"
22 #include <assert.h>
23 #include <dirent.h>
24 #include <errno.h>
25
 
 
 
 
 
 
 
 
 
26 /*
27 ** Make changes to the stable part of the schema (the part that is not
28 ** simply deleted and reconstructed on a rebuild) to bring the schema
29 ** up to the latest.
30 */
@@ -818,28 +827,28 @@
818 /*
819 ** Recursively read all files from the directory zPath and install
820 ** every file read as a new artifact in the repository.
821 */
822 void recon_read_dir(char *zPath){
823 DIR *d;
824 struct dirent *pEntry;
825 Blob aContent; /* content of the just read artifact */
826 static int nFileRead = 0;
827 char *zMbcsPath;
828 char *zUtf8Name;
829
830 zMbcsPath = fossil_utf8_to_mbcs(zPath);
831 d = opendir(zMbcsPath);
832 if( d ){
833 while( (pEntry=readdir(d))!=0 ){
834 Blob path;
835 char *zSubpath;
836
837 if( pEntry->d_name[0]=='.' ){
838 continue;
839 }
840 zUtf8Name = fossil_mbcs_to_utf8(pEntry->d_name);
841 zSubpath = mprintf("%s/%s", zPath, zUtf8Name);
842 fossil_mbcs_free(zUtf8Name);
843 if( file_isdir(zSubpath)==1 ){
844 recon_read_dir(zSubpath);
845 }
@@ -854,11 +863,11 @@
854 blob_reset(&aContent);
855 free(zSubpath);
856 fossil_print("\r%d", ++nFileRead);
857 fflush(stdout);
858 }
859 closedir(d);
860 }else {
861 fossil_panic("encountered error %d while trying to open \"%s\".",
862 errno, g.argv[3]);
863 }
864 fossil_mbcs_free(zMbcsPath);
865
--- src/rebuild.c
+++ src/rebuild.c
@@ -21,10 +21,19 @@
21 #include "rebuild.h"
22 #include <assert.h>
23 #include <dirent.h>
24 #include <errno.h>
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
35 /*
36 ** Make changes to the stable part of the schema (the part that is not
37 ** simply deleted and reconstructed on a rebuild) to bring the schema
38 ** up to the latest.
39 */
@@ -818,28 +827,28 @@
827 /*
828 ** Recursively read all files from the directory zPath and install
829 ** every file read as a new artifact in the repository.
830 */
831 void recon_read_dir(char *zPath){
832 _WDIR *d;
833 struct _wdirent *pEntry;
834 Blob aContent; /* content of the just read artifact */
835 static int nFileRead = 0;
836 wchar_t *zMbcsPath;
837 char *zUtf8Name;
838
839 zMbcsPath = fossil_utf8_to_unicode(zPath);
840 d = _wopendir(zMbcsPath);
841 if( d ){
842 while( (pEntry=_wreaddir(d))!=0 ){
843 Blob path;
844 char *zSubpath;
845
846 if( pEntry->d_name[0]=='.' ){
847 continue;
848 }
849 zUtf8Name = fossil_unicode_to_utf8(pEntry->d_name);
850 zSubpath = mprintf("%s/%s", zPath, zUtf8Name);
851 fossil_mbcs_free(zUtf8Name);
852 if( file_isdir(zSubpath)==1 ){
853 recon_read_dir(zSubpath);
854 }
@@ -854,11 +863,11 @@
863 blob_reset(&aContent);
864 free(zSubpath);
865 fossil_print("\r%d", ++nFileRead);
866 fflush(stdout);
867 }
868 _wclosedir(d);
869 }else {
870 fossil_panic("encountered error %d while trying to open \"%s\".",
871 errno, g.argv[3]);
872 }
873 fossil_mbcs_free(zMbcsPath);
874
+17 -8
--- src/vfile.c
+++ src/vfile.c
@@ -25,10 +25,19 @@
2525
#include "dirent.h"
2626
#else
2727
#include <dirent.h>
2828
#endif
2929
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
+
3039
/*
3140
** The input is guaranteed to be a 40-character well-formed UUID.
3241
** Find its rid.
3342
*/
3443
int fast_uuid_to_rid(const char *zUuid){
@@ -381,18 +390,18 @@
381390
** Any files or directories that match the glob pattern pIgnore are
382391
** excluded from the scan. Name matching occurs after the first
383392
** nPrefix characters are elided from the filename.
384393
*/
385394
void vfile_scan(Blob *pPath, int nPrefix, int allFlag, Glob *pIgnore){
386
- DIR *d;
395
+ _WDIR *d;
387396
int origSize;
388397
const char *zDir;
389
- struct dirent *pEntry;
398
+ struct _wdirent *pEntry;
390399
int skipAll = 0;
391400
static Stmt ins;
392401
static int depth = 0;
393
- char *zMbcs;
402
+ wchar_t *zMbcs;
394403
395404
origSize = blob_size(pPath);
396405
if( pIgnore ){
397406
blob_appendf(pPath, "/");
398407
if( glob_match(pIgnore, &blob_str(pPath)[nPrefix+1]) ) skipAll = 1;
@@ -407,22 +416,22 @@
407416
);
408417
}
409418
depth++;
410419
411420
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);
414423
if( d ){
415
- while( (pEntry=readdir(d))!=0 ){
424
+ while( (pEntry=_wreaddir(d))!=0 ){
416425
char *zPath;
417426
char *zUtf8;
418427
if( pEntry->d_name[0]=='.' ){
419428
if( !allFlag ) continue;
420429
if( pEntry->d_name[1]==0 ) continue;
421430
if( pEntry->d_name[1]=='.' && pEntry->d_name[2]==0 ) continue;
422431
}
423
- zUtf8 = fossil_mbcs_to_utf8(pEntry->d_name);
432
+ zUtf8 = fossil_unicode_to_utf8(pEntry->d_name);
424433
blob_appendf(pPath, "/%s", zUtf8);
425434
fossil_mbcs_free(zUtf8);
426435
zPath = blob_str(pPath);
427436
if( glob_match(pIgnore, &zPath[nPrefix+1]) ){
428437
/* do nothing */
@@ -435,11 +444,11 @@
435444
db_step(&ins);
436445
db_reset(&ins);
437446
}
438447
blob_resize(pPath, origSize);
439448
}
440
- closedir(d);
449
+ _wclosedir(d);
441450
}
442451
fossil_mbcs_free(zMbcs);
443452
444453
depth--;
445454
if( depth==0 ){
446455
--- src/vfile.c
+++ src/vfile.c
@@ -25,10 +25,19 @@
25 #include "dirent.h"
26 #else
27 #include <dirent.h>
28 #endif
29
 
 
 
 
 
 
 
 
 
30 /*
31 ** The input is guaranteed to be a 40-character well-formed UUID.
32 ** Find its rid.
33 */
34 int fast_uuid_to_rid(const char *zUuid){
@@ -381,18 +390,18 @@
381 ** Any files or directories that match the glob pattern pIgnore are
382 ** excluded from the scan. Name matching occurs after the first
383 ** nPrefix characters are elided from the filename.
384 */
385 void vfile_scan(Blob *pPath, int nPrefix, int allFlag, Glob *pIgnore){
386 DIR *d;
387 int origSize;
388 const char *zDir;
389 struct dirent *pEntry;
390 int skipAll = 0;
391 static Stmt ins;
392 static int depth = 0;
393 char *zMbcs;
394
395 origSize = blob_size(pPath);
396 if( pIgnore ){
397 blob_appendf(pPath, "/");
398 if( glob_match(pIgnore, &blob_str(pPath)[nPrefix+1]) ) skipAll = 1;
@@ -407,22 +416,22 @@
407 );
408 }
409 depth++;
410
411 zDir = blob_str(pPath);
412 zMbcs = fossil_utf8_to_mbcs(zDir);
413 d = opendir(zMbcs);
414 if( d ){
415 while( (pEntry=readdir(d))!=0 ){
416 char *zPath;
417 char *zUtf8;
418 if( pEntry->d_name[0]=='.' ){
419 if( !allFlag ) continue;
420 if( pEntry->d_name[1]==0 ) continue;
421 if( pEntry->d_name[1]=='.' && pEntry->d_name[2]==0 ) continue;
422 }
423 zUtf8 = fossil_mbcs_to_utf8(pEntry->d_name);
424 blob_appendf(pPath, "/%s", zUtf8);
425 fossil_mbcs_free(zUtf8);
426 zPath = blob_str(pPath);
427 if( glob_match(pIgnore, &zPath[nPrefix+1]) ){
428 /* do nothing */
@@ -435,11 +444,11 @@
435 db_step(&ins);
436 db_reset(&ins);
437 }
438 blob_resize(pPath, origSize);
439 }
440 closedir(d);
441 }
442 fossil_mbcs_free(zMbcs);
443
444 depth--;
445 if( depth==0 ){
446
--- src/vfile.c
+++ src/vfile.c
@@ -25,10 +25,19 @@
25 #include "dirent.h"
26 #else
27 #include <dirent.h>
28 #endif
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
39 /*
40 ** The input is guaranteed to be a 40-character well-formed UUID.
41 ** Find its rid.
42 */
43 int fast_uuid_to_rid(const char *zUuid){
@@ -381,18 +390,18 @@
390 ** Any files or directories that match the glob pattern pIgnore are
391 ** excluded from the scan. Name matching occurs after the first
392 ** nPrefix characters are elided from the filename.
393 */
394 void vfile_scan(Blob *pPath, int nPrefix, int allFlag, Glob *pIgnore){
395 _WDIR *d;
396 int origSize;
397 const char *zDir;
398 struct _wdirent *pEntry;
399 int skipAll = 0;
400 static Stmt ins;
401 static int depth = 0;
402 wchar_t *zMbcs;
403
404 origSize = blob_size(pPath);
405 if( pIgnore ){
406 blob_appendf(pPath, "/");
407 if( glob_match(pIgnore, &blob_str(pPath)[nPrefix+1]) ) skipAll = 1;
@@ -407,22 +416,22 @@
416 );
417 }
418 depth++;
419
420 zDir = blob_str(pPath);
421 zMbcs = fossil_utf8_to_unicode(zDir);
422 d = _wopendir(zMbcs);
423 if( d ){
424 while( (pEntry=_wreaddir(d))!=0 ){
425 char *zPath;
426 char *zUtf8;
427 if( pEntry->d_name[0]=='.' ){
428 if( !allFlag ) continue;
429 if( pEntry->d_name[1]==0 ) continue;
430 if( pEntry->d_name[1]=='.' && pEntry->d_name[2]==0 ) continue;
431 }
432 zUtf8 = fossil_unicode_to_utf8(pEntry->d_name);
433 blob_appendf(pPath, "/%s", zUtf8);
434 fossil_mbcs_free(zUtf8);
435 zPath = blob_str(pPath);
436 if( glob_match(pIgnore, &zPath[nPrefix+1]) ){
437 /* do nothing */
@@ -435,11 +444,11 @@
444 db_step(&ins);
445 db_reset(&ins);
446 }
447 blob_resize(pPath, origSize);
448 }
449 _wclosedir(d);
450 }
451 fossil_mbcs_free(zMbcs);
452
453 depth--;
454 if( depth==0 ){
455

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button