|
Lines 52-57
Link Here
|
| 52 |
#include "extern.h" |
52 |
#include "extern.h" |
| 53 |
|
53 |
|
| 54 |
#define ROUNDPAGE(i) ((i) & ~pagemask) |
54 |
#define ROUNDPAGE(i) ((i) & ~pagemask) |
|
|
55 |
#define MMAP_CHUNK (8*1024*1024) |
| 55 |
|
56 |
|
| 56 |
void |
57 |
void |
| 57 |
c_regular(fd1, file1, skip1, len1, fd2, file2, skip2, len2) |
58 |
c_regular(fd1, file1, skip1, len1, fd2, file2, skip2, len2) |
|
Lines 59-68
Link Here
|
| 59 |
char *file1, *file2; |
60 |
char *file1, *file2; |
| 60 |
off_t skip1, len1, skip2, len2; |
61 |
off_t skip1, len1, skip2, len2; |
| 61 |
{ |
62 |
{ |
| 62 |
u_char ch, *p1, *p2; |
63 |
u_char ch, *p1, *p2, *m1, *m2; |
| 63 |
off_t byte, length, line; |
64 |
off_t byte, length, line; |
| 64 |
int dfound; |
65 |
int dfound; |
| 65 |
off_t pagemask, off1, off2; |
66 |
off_t pagemask, off1, off2, st1, st2; |
| 66 |
size_t pagesize; |
67 |
size_t pagesize; |
| 67 |
|
68 |
|
| 68 |
if (skip1 > len1) |
69 |
if (skip1 > len1) |
|
Lines 81-107
Link Here
|
| 81 |
off2 = ROUNDPAGE(skip2); |
82 |
off2 = ROUNDPAGE(skip2); |
| 82 |
|
83 |
|
| 83 |
length = MIN(len1, len2); |
84 |
length = MIN(len1, len2); |
| 84 |
if (length > SIZE_T_MAX) |
85 |
dfound = 0; |
| 85 |
return (c_special(fd1, file1, skip1, fd2, file2, skip2)); |
86 |
st1 = skip1 - off1; |
|
|
87 |
st2 = skip2 - off2; |
| 86 |
|
88 |
|
| 87 |
if ((p1 = (u_char *)mmap(NULL, (size_t)len1 + skip1 % pagesize, |
89 |
m1 = remmap(NULL, fd1, off1); |
| 88 |
PROT_READ, MAP_SHARED, fd1, off1)) == (u_char *)MAP_FAILED) |
90 |
m2 = remmap(NULL, fd2, off2); |
| 89 |
err(ERR_EXIT, "%s", file1); |
91 |
if (!m1 || !m2) |
| 90 |
|
92 |
c_special(fd1, file1, skip1, fd2, file2, skip2); |
| 91 |
madvise(p1, len1 + skip1 % pagesize, MADV_SEQUENTIAL); |
93 |
/* NOTREACHED */ |
| 92 |
if ((p2 = (u_char *)mmap(NULL, (size_t)len2 + skip2 % pagesize, |
|
|
| 93 |
PROT_READ, MAP_SHARED, fd2, off2)) == (u_char *)MAP_FAILED) |
| 94 |
err(ERR_EXIT, "%s", file2); |
| 95 |
madvise(p2, len2 + skip2 % pagesize, MADV_SEQUENTIAL); |
| 96 |
|
94 |
|
| 97 |
dfound = 0; |
95 |
p1 = m1 + st1; |
| 98 |
p1 += skip1 - off1; |
96 |
p2 = m2 + st2; |
| 99 |
p2 += skip2 - off2; |
97 |
|
| 100 |
for (byte = line = 1; length--; ++p1, ++p2, ++byte) { |
98 |
for (byte = line = 1; length--; ++byte) { |
| 101 |
if ((ch = *p1) != *p2) { |
99 |
if ((ch = *p1) != *p2) { |
| 102 |
if (xflag) { |
100 |
if (xflag) { |
| 103 |
dfound = 1; |
101 |
dfound = 1; |
| 104 |
(void)printf("%08qx %02x %02x\n", byte - 1, ch, *p2); |
102 |
(void)printf("%08qx %02x %02x\n", byte - 1, |
|
|
103 |
ch, *p2); |
| 105 |
} else if (lflag) { |
104 |
} else if (lflag) { |
| 106 |
dfound = 1; |
105 |
dfound = 1; |
| 107 |
(void)printf("%6qd %3o %3o\n", byte, ch, *p2); |
106 |
(void)printf("%6qd %3o %3o\n", byte, ch, *p2); |
|
Lines 111-120
Link Here
|
| 111 |
} |
110 |
} |
| 112 |
if (ch == '\n') |
111 |
if (ch == '\n') |
| 113 |
++line; |
112 |
++line; |
|
|
113 |
if (++st1 == MMAP_CHUNK) { |
| 114 |
st1 = 0; |
| 115 |
off1 += MMAP_CHUNK; |
| 116 |
p1 = m1 = remmap(m1, fd1, off1); |
| 117 |
} else |
| 118 |
++p1; |
| 119 |
if (++st2 == MMAP_CHUNK) { |
| 120 |
st2 = 0; |
| 121 |
off2 += MMAP_CHUNK; |
| 122 |
p2 = m2 = remmap(m2, fd2, off2); |
| 123 |
} else |
| 124 |
++p2; |
| 125 |
if (!m1 || !m2) |
| 126 |
c_special(fd1, file1, skip1, fd2, file2, skip2); |
| 127 |
/* NOTREACHED */ |
| 114 |
} |
128 |
} |
| 115 |
|
129 |
|
| 116 |
if (len1 != len2) |
130 |
if (len1 != len2) |
| 117 |
eofmsg (len1 > len2 ? file2 : file1); |
131 |
eofmsg (len1 > len2 ? file2 : file1); |
| 118 |
if (dfound) |
132 |
if (dfound) |
| 119 |
exit(DIFF_EXIT); |
133 |
exit(DIFF_EXIT); |
|
|
134 |
} |
| 135 |
|
| 136 |
u_char * |
| 137 |
remmap(mem, fd, offset) |
| 138 |
u_char *mem; |
| 139 |
int fd; |
| 140 |
off_t offset; |
| 141 |
{ |
| 142 |
if (mem) |
| 143 |
munmap(mem, MMAP_CHUNK); |
| 144 |
mem = (u_char *)mmap(NULL, MMAP_CHUNK, PROT_READ, MAP_SHARED, fd, |
| 145 |
offset); |
| 146 |
if (mem == (u_char *)MAP_FAILED) |
| 147 |
return (NULL); |
| 148 |
madvise(mem, MMAP_CHUNK, MADV_SEQUENTIAL); |
| 149 |
return (mem); |
| 120 |
} |
150 |
} |