diff options
author | Ron Yorston <rmy@pobox.com> | 2013-03-19 12:53:48 +0000 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2013-03-19 12:53:48 +0000 |
commit | e6bb3e5823c27432d025cebc950a404bc373ce41 (patch) | |
tree | ec477eec5021502a44cf2954e1cd0968b9171582 | |
parent | 63d2c5fead323df5f4250ed544d0bc03527c8936 (diff) | |
download | busybox-w32-e6bb3e5823c27432d025cebc950a404bc373ce41.tar.gz busybox-w32-e6bb3e5823c27432d025cebc950a404bc373ce41.tar.bz2 busybox-w32-e6bb3e5823c27432d025cebc950a404bc373ce41.zip |
vi: handle CRLF line ending
-rw-r--r-- | editors/vi.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/editors/vi.c b/editors/vi.c index 63b984ea6..d6c8c0dd8 100644 --- a/editors/vi.c +++ b/editors/vi.c | |||
@@ -2532,6 +2532,9 @@ static int file_insert(const char *fn, char *p, int update_ro_status) | |||
2532 | status_line_bold_errno(fn); | 2532 | status_line_bold_errno(fn); |
2533 | goto fi0; | 2533 | goto fi0; |
2534 | } | 2534 | } |
2535 | #if ENABLE_PLATFORM_MINGW32 | ||
2536 | _setmode(fd, _O_TEXT); | ||
2537 | #endif | ||
2535 | size = (statbuf.st_size < INT_MAX ? (int)statbuf.st_size : INT_MAX); | 2538 | size = (statbuf.st_size < INT_MAX ? (int)statbuf.st_size : INT_MAX); |
2536 | p += text_hole_make(p, size); | 2539 | p += text_hole_make(p, size); |
2537 | cnt = safe_read(fd, p, size); | 2540 | cnt = safe_read(fd, p, size); |
@@ -2540,8 +2543,25 @@ static int file_insert(const char *fn, char *p, int update_ro_status) | |||
2540 | p = text_hole_delete(p, p + size - 1); // un-do buffer insert | 2543 | p = text_hole_delete(p, p + size - 1); // un-do buffer insert |
2541 | } else if (cnt < size) { | 2544 | } else if (cnt < size) { |
2542 | // There was a partial read, shrink unused space text[] | 2545 | // There was a partial read, shrink unused space text[] |
2546 | #if ENABLE_PLATFORM_MINGW32 | ||
2547 | int i, newline; | ||
2548 | |||
2549 | newline = 0; | ||
2550 | for ( i=0; i<cnt; ++i ) { | ||
2551 | if ( p[i] == '\n' ) { | ||
2552 | ++newline; | ||
2553 | } | ||
2554 | } | ||
2555 | #endif | ||
2543 | p = text_hole_delete(p + cnt, p + size - 1); // un-do buffer insert | 2556 | p = text_hole_delete(p + cnt, p + size - 1); // un-do buffer insert |
2557 | #if ENABLE_PLATFORM_MINGW32 | ||
2558 | // on WIN32 a partial read might just mean CRs have been removed | ||
2559 | if ( cnt+newline != size ) { | ||
2560 | status_line_bold("can't read '%s'", fn); | ||
2561 | } | ||
2562 | #else | ||
2544 | status_line_bold("can't read '%s'", fn); | 2563 | status_line_bold("can't read '%s'", fn); |
2564 | #endif | ||
2545 | } | 2565 | } |
2546 | if (cnt >= size) | 2566 | if (cnt >= size) |
2547 | file_modified++; | 2567 | file_modified++; |
@@ -2564,6 +2584,9 @@ static int file_insert(const char *fn, char *p, int update_ro_status) | |||
2564 | static int file_write(char *fn, char *first, char *last) | 2584 | static int file_write(char *fn, char *first, char *last) |
2565 | { | 2585 | { |
2566 | int fd, cnt, charcnt; | 2586 | int fd, cnt, charcnt; |
2587 | #if ENABLE_PLATFORM_MINGW32 | ||
2588 | int i, newline; | ||
2589 | #endif | ||
2567 | 2590 | ||
2568 | if (fn == 0) { | 2591 | if (fn == 0) { |
2569 | status_line_bold("No current filename"); | 2592 | status_line_bold("No current filename"); |
@@ -2577,8 +2600,23 @@ static int file_write(char *fn, char *first, char *last) | |||
2577 | if (fd < 0) | 2600 | if (fd < 0) |
2578 | return -1; | 2601 | return -1; |
2579 | cnt = last - first + 1; | 2602 | cnt = last - first + 1; |
2603 | #if ENABLE_PLATFORM_MINGW32 | ||
2604 | /* write file in text mode; this makes it bigger so adjust | ||
2605 | * the truncation to match | ||
2606 | */ | ||
2607 | _setmode(fd, _O_TEXT); | ||
2608 | newline = 0; | ||
2609 | for ( i=0; i<cnt; ++i ) { | ||
2610 | if ( first[i] == '\n' ) { | ||
2611 | ++newline; | ||
2612 | } | ||
2613 | } | ||
2614 | charcnt = full_write(fd, first, cnt); | ||
2615 | ftruncate(fd, charcnt+newline); | ||
2616 | #else | ||
2580 | charcnt = full_write(fd, first, cnt); | 2617 | charcnt = full_write(fd, first, cnt); |
2581 | ftruncate(fd, charcnt); | 2618 | ftruncate(fd, charcnt); |
2619 | #endif | ||
2582 | if (charcnt == cnt) { | 2620 | if (charcnt == cnt) { |
2583 | // good write | 2621 | // good write |
2584 | //file_modified = FALSE; | 2622 | //file_modified = FALSE; |