diff options
Diffstat (limited to 'editors/diff.c')
| -rw-r--r-- | editors/diff.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/editors/diff.c b/editors/diff.c index 6f4ed9712..8911859cd 100644 --- a/editors/diff.c +++ b/editors/diff.c | |||
| @@ -119,6 +119,9 @@ | |||
| 119 | //usage: "\n -t Expand tabs to spaces in output" | 119 | //usage: "\n -t Expand tabs to spaces in output" |
| 120 | //usage: "\n -U Output LINES lines of context" | 120 | //usage: "\n -U Output LINES lines of context" |
| 121 | //usage: "\n -w Ignore all whitespace" | 121 | //usage: "\n -w Ignore all whitespace" |
| 122 | //usage: IF_PLATFORM_MINGW32(IF_FEATURE_DIFF_LONG_OPTIONS( | ||
| 123 | //usage: "\n --binary Treat input as binary, not text" | ||
| 124 | //usage: )) | ||
| 122 | 125 | ||
| 123 | #include "libbb.h" | 126 | #include "libbb.h" |
| 124 | #include "common_bufsiz.h" | 127 | #include "common_bufsiz.h" |
| @@ -154,6 +157,9 @@ enum { /* Commandline flags */ | |||
| 154 | FLAG_p, /* not implemented */ | 157 | FLAG_p, /* not implemented */ |
| 155 | FLAG_B, | 158 | FLAG_B, |
| 156 | FLAG_E, /* not implemented */ | 159 | FLAG_E, /* not implemented */ |
| 160 | #if ENABLE_PLATFORM_MINGW32 && ENABLE_FEATURE_DIFF_LONG_OPTIONS | ||
| 161 | FLAG_binary, | ||
| 162 | #endif | ||
| 157 | }; | 163 | }; |
| 158 | #define FLAG(x) (1 << FLAG_##x) | 164 | #define FLAG(x) (1 << FLAG_##x) |
| 159 | 165 | ||
| @@ -217,6 +223,9 @@ static int read_token(FILE_and_pos_t *ft, token_t tok) | |||
| 217 | int t; | 223 | int t; |
| 218 | 224 | ||
| 219 | t = fgetc(ft->ft_fp); | 225 | t = fgetc(ft->ft_fp); |
| 226 | #if ENABLE_PLATFORM_MINGW32 && ENABLE_FEATURE_DIFF_LONG_OPTIONS | ||
| 227 | newline: | ||
| 228 | #endif | ||
| 220 | if (t != EOF) | 229 | if (t != EOF) |
| 221 | ft->ft_pos++; | 230 | ft->ft_pos++; |
| 222 | is_space = (t == EOF || isspace(t)); | 231 | is_space = (t == EOF || isspace(t)); |
| @@ -232,6 +241,16 @@ static int read_token(FILE_and_pos_t *ft, token_t tok) | |||
| 232 | 241 | ||
| 233 | if ((option_mask32 & FLAG(w)) && is_space) | 242 | if ((option_mask32 & FLAG(w)) && is_space) |
| 234 | continue; | 243 | continue; |
| 244 | #if ENABLE_PLATFORM_MINGW32 && ENABLE_FEATURE_DIFF_LONG_OPTIONS | ||
| 245 | if (!(option_mask32 & FLAG(binary)) && t == '\r') { | ||
| 246 | int t2 = fgetc(ft->ft_fp); | ||
| 247 | if (t2 == '\n') { | ||
| 248 | t = t2; | ||
| 249 | goto newline; | ||
| 250 | } | ||
| 251 | ungetc(t2, ft->ft_fp); | ||
| 252 | } | ||
| 253 | #endif | ||
| 235 | 254 | ||
| 236 | /* Trim char value to low 9 bits */ | 255 | /* Trim char value to low 9 bits */ |
| 237 | t &= CHAR_MASK; | 256 | t &= CHAR_MASK; |
| @@ -709,6 +728,10 @@ static int diffreg(char *file[2]) | |||
| 709 | FILE *fp[2]; | 728 | FILE *fp[2]; |
| 710 | bool binary = false, differ = false; | 729 | bool binary = false, differ = false; |
| 711 | int status = STATUS_SAME, i; | 730 | int status = STATUS_SAME, i; |
| 731 | #if ENABLE_PLATFORM_MINGW32 | ||
| 732 | char *tmpfile[2] = { NULL, NULL }; | ||
| 733 | char *tmpdir; | ||
| 734 | #endif | ||
| 712 | 735 | ||
| 713 | fp[0] = stdin; | 736 | fp[0] = stdin; |
| 714 | fp[1] = stdin; | 737 | fp[1] = stdin; |
| @@ -730,10 +753,19 @@ static int diffreg(char *file[2]) | |||
| 730 | * When we meet non-seekable file, we must make a temp copy. | 753 | * When we meet non-seekable file, we must make a temp copy. |
| 731 | */ | 754 | */ |
| 732 | if (lseek(fd, 0, SEEK_SET) == -1 && errno == ESPIPE) { | 755 | if (lseek(fd, 0, SEEK_SET) == -1 && errno == ESPIPE) { |
| 756 | #if !ENABLE_PLATFORM_MINGW32 | ||
| 733 | char name[] = "/tmp/difXXXXXX"; | 757 | char name[] = "/tmp/difXXXXXX"; |
| 734 | int fd_tmp = xmkstemp(name); | 758 | int fd_tmp = xmkstemp(name); |
| 735 | 759 | ||
| 736 | unlink(name); | 760 | unlink(name); |
| 761 | #else | ||
| 762 | int fd_tmp; | ||
| 763 | |||
| 764 | if (!(tmpdir=getenv("TMPDIR"))) | ||
| 765 | goto out; | ||
| 766 | tmpfile[i] = xasprintf("%s/difXXXXXX", tmpdir); | ||
| 767 | fd_tmp = xmkstemp(tmpfile[i]); | ||
| 768 | #endif | ||
| 737 | if (bb_copyfd_eof(fd, fd_tmp) < 0) | 769 | if (bb_copyfd_eof(fd, fd_tmp) < 0) |
| 738 | xfunc_die(); | 770 | xfunc_die(); |
| 739 | if (fd != STDIN_FILENO) | 771 | if (fd != STDIN_FILENO) |
| @@ -776,6 +808,14 @@ static int diffreg(char *file[2]) | |||
| 776 | out: | 808 | out: |
| 777 | fclose_if_not_stdin(fp[0]); | 809 | fclose_if_not_stdin(fp[0]); |
| 778 | fclose_if_not_stdin(fp[1]); | 810 | fclose_if_not_stdin(fp[1]); |
| 811 | #if ENABLE_PLATFORM_MINGW32 | ||
| 812 | for (i = 0; i < 2; i++) { | ||
| 813 | if (tmpfile[i]) { | ||
| 814 | unlink(tmpfile[i]); | ||
| 815 | free(tmpfile[i]); | ||
| 816 | } | ||
| 817 | } | ||
| 818 | #endif | ||
| 779 | 819 | ||
| 780 | return status; | 820 | return status; |
| 781 | } | 821 | } |
| @@ -964,6 +1004,9 @@ static const char diff_longopts[] ALIGN1 = | |||
| 964 | "report-identical-files\0" No_argument "s" | 1004 | "report-identical-files\0" No_argument "s" |
| 965 | "starting-file\0" Required_argument "S" | 1005 | "starting-file\0" Required_argument "S" |
| 966 | "minimal\0" No_argument "d" | 1006 | "minimal\0" No_argument "d" |
| 1007 | #if ENABLE_PLATFORM_MINGW32 | ||
| 1008 | "binary\0" No_argument "\xff" | ||
| 1009 | #endif | ||
| 967 | ; | 1010 | ; |
| 968 | # define GETOPT32 getopt32long | 1011 | # define GETOPT32 getopt32long |
| 969 | # define LONGOPTS ,diff_longopts | 1012 | # define LONGOPTS ,diff_longopts |
| @@ -1019,6 +1062,11 @@ int diff_main(int argc UNUSED_PARAM, char **argv) | |||
| 1019 | * 255, or if a local inode number (st_ino) exceeds 16777215. | 1062 | * 255, or if a local inode number (st_ino) exceeds 16777215. |
| 1020 | */ | 1063 | */ |
| 1021 | if (ENABLE_DESKTOP | 1064 | if (ENABLE_DESKTOP |
| 1065 | && (ENABLE_PLATFORM_POSIX || ENABLE_FEATURE_EXTRA_FILE_DATA) | ||
| 1066 | #if ENABLE_FEATURE_EXTRA_FILE_DATA | ||
| 1067 | /* ignore invalid inode numbers */ | ||
| 1068 | && stb[0].st_ino != 0 | ||
| 1069 | #endif | ||
| 1022 | && stb[0].st_ino == stb[1].st_ino | 1070 | && stb[0].st_ino == stb[1].st_ino |
| 1023 | && stb[0].st_dev == stb[1].st_dev | 1071 | && stb[0].st_dev == stb[1].st_dev |
| 1024 | && stb[0].st_size == stb[1].st_size | 1072 | && stb[0].st_size == stb[1].st_size |
