Mercurial > vim
comparison src/os_mswin.c @ 5320:07737d3aa817 v7.4.013
updated for version 7.4.013
Problem: File name buffer too small for utf-8.
Solution: Use character count instead of byte count. (Ken Takata)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Fri, 30 Aug 2013 16:51:18 +0200 |
parents | 8e28c23e482c |
children | 4dfba3df303c |
comparison
equal
deleted
inserted
replaced
5319:5f5d9a89de82 | 5320:07737d3aa817 |
---|---|
454 * Return TRUE if "fname" does not depend on the current directory. | 454 * Return TRUE if "fname" does not depend on the current directory. |
455 */ | 455 */ |
456 int | 456 int |
457 mch_isFullName(char_u *fname) | 457 mch_isFullName(char_u *fname) |
458 { | 458 { |
459 #ifdef FEAT_MBYTE | |
460 /* WinNT and later can use _MAX_PATH wide characters for a pathname, which | |
461 * means that the maximum pathname is _MAX_PATH * 3 bytes when 'enc' is | |
462 * UTF-8. */ | |
463 char szName[_MAX_PATH * 3 + 1]; | |
464 #else | |
459 char szName[_MAX_PATH + 1]; | 465 char szName[_MAX_PATH + 1]; |
466 #endif | |
460 | 467 |
461 /* A name like "d:/foo" and "//server/share" is absolute */ | 468 /* A name like "d:/foo" and "//server/share" is absolute */ |
462 if ((fname[0] && fname[1] == ':' && (fname[2] == '/' || fname[2] == '\\')) | 469 if ((fname[0] && fname[1] == ':' && (fname[2] == '/' || fname[2] == '\\')) |
463 || (fname[0] == fname[1] && (fname[0] == '/' || fname[0] == '\\'))) | 470 || (fname[0] == fname[1] && (fname[0] == '/' || fname[0] == '\\'))) |
464 return TRUE; | 471 return TRUE; |
465 | 472 |
466 /* A name that can't be made absolute probably isn't absolute. */ | 473 /* A name that can't be made absolute probably isn't absolute. */ |
467 if (mch_FullName(fname, szName, _MAX_PATH, FALSE) == FAIL) | 474 if (mch_FullName(fname, szName, sizeof(szName) - 1, FALSE) == FAIL) |
468 return FALSE; | 475 return FALSE; |
469 | 476 |
470 return pathcmp(fname, szName, -1) == 0; | 477 return pathcmp(fname, szName, -1) == 0; |
471 } | 478 } |
472 | 479 |
496 * stat() can't handle a trailing '/' or '\', remove it first. | 503 * stat() can't handle a trailing '/' or '\', remove it first. |
497 */ | 504 */ |
498 int | 505 int |
499 vim_stat(const char *name, struct stat *stp) | 506 vim_stat(const char *name, struct stat *stp) |
500 { | 507 { |
508 #ifdef FEAT_MBYTE | |
509 /* WinNT and later can use _MAX_PATH wide characters for a pathname, which | |
510 * means that the maximum pathname is _MAX_PATH * 3 bytes when 'enc' is | |
511 * UTF-8. */ | |
512 char buf[_MAX_PATH * 3 + 1]; | |
513 #else | |
501 char buf[_MAX_PATH + 1]; | 514 char buf[_MAX_PATH + 1]; |
515 #endif | |
502 char *p; | 516 char *p; |
503 | 517 |
504 vim_strncpy((char_u *)buf, (char_u *)name, _MAX_PATH); | 518 vim_strncpy((char_u *)buf, (char_u *)name, sizeof(buf) - 1); |
505 p = buf + strlen(buf); | 519 p = buf + strlen(buf); |
506 if (p > buf) | 520 if (p > buf) |
507 mb_ptr_back(buf, p); | 521 mb_ptr_back(buf, p); |
508 if (p > buf && (*p == '\\' || *p == '/') && p[-1] != ':') | 522 if (p > buf && (*p == '\\' || *p == '/') && p[-1] != ':') |
509 *p = NUL; | 523 *p = NUL; |