Fossil SCM

Abstract the getcwd() system library routine into file_getcwd() with appropriate translations on windows.

drh 2011-05-20 15:31 trunk
Commit 4b3425401f847e57991cc980122ac37a8f1d00a3
2 files changed +1 -7 +34 -10
+1 -7
--- src/db.c
+++ src/db.c
@@ -804,21 +804,15 @@
804804
** is found, it is attached to the open database connection too.
805805
*/
806806
int db_open_local(void){
807807
int i, n;
808808
char zPwd[2000];
809
- char *zPwdConv;
810809
static const char *aDbName[] = { "/_FOSSIL_", "/.fos" };
811810
812811
if( g.localOpen) return 1;
813
- if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){
814
- db_err("pwd too big: max %d", sizeof(zPwd)-20);
815
- }
812
+ file_getcwd(zPwd, sizeof(zPwd)-20);
816813
n = strlen(zPwd);
817
- zPwdConv = mprintf("%/", zPwd);
818
- strncpy(zPwd, zPwdConv, 2000-20);
819
- free(zPwdConv);
820814
while( n>0 ){
821815
if( file_access(zPwd, W_OK) ) break;
822816
for(i=0; i<sizeof(aDbName)/sizeof(aDbName[0]); i++){
823817
sqlite3_snprintf(sizeof(zPwd)-n, &zPwd[n], "%s", aDbName[i]);
824818
if( isValidLocalDb(zPwd) ){
825819
--- src/db.c
+++ src/db.c
@@ -804,21 +804,15 @@
804 ** is found, it is attached to the open database connection too.
805 */
806 int db_open_local(void){
807 int i, n;
808 char zPwd[2000];
809 char *zPwdConv;
810 static const char *aDbName[] = { "/_FOSSIL_", "/.fos" };
811
812 if( g.localOpen) return 1;
813 if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){
814 db_err("pwd too big: max %d", sizeof(zPwd)-20);
815 }
816 n = strlen(zPwd);
817 zPwdConv = mprintf("%/", zPwd);
818 strncpy(zPwd, zPwdConv, 2000-20);
819 free(zPwdConv);
820 while( n>0 ){
821 if( file_access(zPwd, W_OK) ) break;
822 for(i=0; i<sizeof(aDbName)/sizeof(aDbName[0]); i++){
823 sqlite3_snprintf(sizeof(zPwd)-n, &zPwd[n], "%s", aDbName[i]);
824 if( isValidLocalDb(zPwd) ){
825
--- src/db.c
+++ src/db.c
@@ -804,21 +804,15 @@
804 ** is found, it is attached to the open database connection too.
805 */
806 int db_open_local(void){
807 int i, n;
808 char zPwd[2000];
 
809 static const char *aDbName[] = { "/_FOSSIL_", "/.fos" };
810
811 if( g.localOpen) return 1;
812 file_getcwd(zPwd, sizeof(zPwd)-20);
 
 
813 n = strlen(zPwd);
 
 
 
814 while( n>0 ){
815 if( file_access(zPwd, W_OK) ) break;
816 for(i=0; i<sizeof(aDbName)/sizeof(aDbName[0]); i++){
817 sqlite3_snprintf(sizeof(zPwd)-n, &zPwd[n], "%s", aDbName[i]);
818 if( isValidLocalDb(zPwd) ){
819
+34 -10
--- src/file.c
+++ src/file.c
@@ -381,10 +381,41 @@
381381
file_simplify_name(z, -1);
382382
fossil_print("[%s]\n", z);
383383
fossil_free(z);
384384
}
385385
}
386
+
387
+/*
388
+** Get the current working directory.
389
+**
390
+** On windows, the name is converted from MBCS to UTF8 and all '\\'
391
+** characters are converted to '/'. No conversions are needed on
392
+** unix.
393
+*/
394
+void file_getcwd(char *zBuf, int nBuf){
395
+#ifdef _WIN32
396
+ char *zPwdUtf8;
397
+ int nPwd;
398
+ int i;
399
+ char zPwd[2000];
400
+ if( getcwd(zPwd, sizeof(zPwd)-1)==0 ){
401
+ fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-1);
402
+ }
403
+ zPwdUtf8 = fossil_mbcs_to_utf8(zPwd);
404
+ nPwd = strlen(zPwdUtf8);
405
+ if( nPwd > nBuf-1 ){
406
+ fossil_fatal("pwd too big: max %d\n", nBuf-1);
407
+ }
408
+ for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/';
409
+ memcpy(zBuf, zPwdUtf8, nPwd+1);
410
+ fossil_mbcs_free(zPwdUtf8);
411
+#else
412
+ if( getcwd(zBuf, nBuf-1)==0 ){
413
+ fossil_fatal("pwd too big: max %d\n", nBuf-1);
414
+ }
415
+#endif
416
+}
386417
387418
/*
388419
** Compute a canonical pathname for a file or directory.
389420
** Make the name absolute if it is relative.
390421
** Remove redundant / characters
@@ -401,18 +432,13 @@
401432
){
402433
blob_set(pOut, zOrigName);
403434
blob_materialize(pOut);
404435
}else{
405436
char zPwd[2000];
406
- char *zPwdUtf8;
407
- if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){
408
- fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-20);
409
- }
437
+ file_getcwd(zPwd, sizeof(zPwd)-strlen(zOrigName));
410438
blob_zero(pOut);
411
- zPwdUtf8 = fossil_mbcs_to_utf8(zPwd);
412
- blob_appendf(pOut, "%//%/", zPwdUtf8, zOrigName);
413
- fossil_mbcs_free(zPwdUtf8);
439
+ blob_appendf(pOut, "%//%/", zPwd, zOrigName);
414440
}
415441
blob_resize(pOut, file_simplify_name(blob_buffer(pOut), blob_size(pOut)));
416442
}
417443
418444
/*
@@ -479,13 +505,11 @@
479505
zPath = blob_buffer(pOut);
480506
if( zPath[0]=='/' ){
481507
int i, j;
482508
Blob tmp;
483509
char zPwd[2000];
484
- if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){
485
- fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-20);
486
- }
510
+ file_getcwd(zPwd, sizeof(zPwd)-20);
487511
for(i=1; zPath[i] && zPwd[i]==zPath[i]; i++){}
488512
if( zPath[i]==0 ){
489513
blob_reset(pOut);
490514
if( zPwd[i]==0 ){
491515
blob_append(pOut, ".", 1);
492516
--- src/file.c
+++ src/file.c
@@ -381,10 +381,41 @@
381 file_simplify_name(z, -1);
382 fossil_print("[%s]\n", z);
383 fossil_free(z);
384 }
385 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
386
387 /*
388 ** Compute a canonical pathname for a file or directory.
389 ** Make the name absolute if it is relative.
390 ** Remove redundant / characters
@@ -401,18 +432,13 @@
401 ){
402 blob_set(pOut, zOrigName);
403 blob_materialize(pOut);
404 }else{
405 char zPwd[2000];
406 char *zPwdUtf8;
407 if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){
408 fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-20);
409 }
410 blob_zero(pOut);
411 zPwdUtf8 = fossil_mbcs_to_utf8(zPwd);
412 blob_appendf(pOut, "%//%/", zPwdUtf8, zOrigName);
413 fossil_mbcs_free(zPwdUtf8);
414 }
415 blob_resize(pOut, file_simplify_name(blob_buffer(pOut), blob_size(pOut)));
416 }
417
418 /*
@@ -479,13 +505,11 @@
479 zPath = blob_buffer(pOut);
480 if( zPath[0]=='/' ){
481 int i, j;
482 Blob tmp;
483 char zPwd[2000];
484 if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){
485 fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-20);
486 }
487 for(i=1; zPath[i] && zPwd[i]==zPath[i]; i++){}
488 if( zPath[i]==0 ){
489 blob_reset(pOut);
490 if( zPwd[i]==0 ){
491 blob_append(pOut, ".", 1);
492
--- src/file.c
+++ src/file.c
@@ -381,10 +381,41 @@
381 file_simplify_name(z, -1);
382 fossil_print("[%s]\n", z);
383 fossil_free(z);
384 }
385 }
386
387 /*
388 ** Get the current working directory.
389 **
390 ** On windows, the name is converted from MBCS to UTF8 and all '\\'
391 ** characters are converted to '/'. No conversions are needed on
392 ** unix.
393 */
394 void file_getcwd(char *zBuf, int nBuf){
395 #ifdef _WIN32
396 char *zPwdUtf8;
397 int nPwd;
398 int i;
399 char zPwd[2000];
400 if( getcwd(zPwd, sizeof(zPwd)-1)==0 ){
401 fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-1);
402 }
403 zPwdUtf8 = fossil_mbcs_to_utf8(zPwd);
404 nPwd = strlen(zPwdUtf8);
405 if( nPwd > nBuf-1 ){
406 fossil_fatal("pwd too big: max %d\n", nBuf-1);
407 }
408 for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/';
409 memcpy(zBuf, zPwdUtf8, nPwd+1);
410 fossil_mbcs_free(zPwdUtf8);
411 #else
412 if( getcwd(zBuf, nBuf-1)==0 ){
413 fossil_fatal("pwd too big: max %d\n", nBuf-1);
414 }
415 #endif
416 }
417
418 /*
419 ** Compute a canonical pathname for a file or directory.
420 ** Make the name absolute if it is relative.
421 ** Remove redundant / characters
@@ -401,18 +432,13 @@
432 ){
433 blob_set(pOut, zOrigName);
434 blob_materialize(pOut);
435 }else{
436 char zPwd[2000];
437 file_getcwd(zPwd, sizeof(zPwd)-strlen(zOrigName));
 
 
 
438 blob_zero(pOut);
439 blob_appendf(pOut, "%//%/", zPwd, zOrigName);
 
 
440 }
441 blob_resize(pOut, file_simplify_name(blob_buffer(pOut), blob_size(pOut)));
442 }
443
444 /*
@@ -479,13 +505,11 @@
505 zPath = blob_buffer(pOut);
506 if( zPath[0]=='/' ){
507 int i, j;
508 Blob tmp;
509 char zPwd[2000];
510 file_getcwd(zPwd, sizeof(zPwd)-20);
 
 
511 for(i=1; zPath[i] && zPwd[i]==zPath[i]; i++){}
512 if( zPath[i]==0 ){
513 blob_reset(pOut);
514 if( zPwd[i]==0 ){
515 blob_append(pOut, ".", 1);
516

Keyboard Shortcuts

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