Changeset View
Changeset View
Standalone View
Standalone View
usr.bin/cmp/regular.c
Show First 20 Lines • Show All 53 Lines • ▼ Show 20 Lines | |||||
#define MMAP_CHUNK (8*1024*1024) | #define MMAP_CHUNK (8*1024*1024) | ||||
#define ROUNDPAGE(i) ((i) & ~pagemask) | #define ROUNDPAGE(i) ((i) & ~pagemask) | ||||
void | void | ||||
c_regular(int fd1, const char *file1, off_t skip1, off_t len1, | c_regular(int fd1, const char *file1, off_t skip1, off_t len1, | ||||
int fd2, const char *file2, off_t skip2, off_t len2) | int fd2, const char *file2, off_t skip2, off_t len2) | ||||
{ | { | ||||
u_char ch, *p1, *p2, *m1, *m2, *e1, *e2; | u_char *p1, *p2, *m1, *m2, *e1, *e2; | ||||
off_t byte, length, line; | off_t byte, length, line; | ||||
int dfound; | size_t l; | ||||
int dfound, tryfast; | |||||
off_t pagemask, off1, off2; | off_t pagemask, off1, off2; | ||||
size_t pagesize; | size_t pagesize; | ||||
struct sigaction act, oact; | struct sigaction act, oact; | ||||
if (skip1 > len1) | if (skip1 > len1) | ||||
eofmsg(file1); | eofmsg(file1); | ||||
len1 -= skip1; | len1 -= skip1; | ||||
if (skip2 > len2) | if (skip2 > len2) | ||||
Show All 23 Lines | c_regular(int fd1, const char *file1, off_t skip1, off_t len1, | ||||
if ((m2 = remmap(NULL, fd2, off2)) == NULL) { | if ((m2 = remmap(NULL, fd2, off2)) == NULL) { | ||||
munmap(m1, MMAP_CHUNK); | munmap(m1, MMAP_CHUNK); | ||||
c_special(fd1, file1, skip1, fd2, file2, skip2); | c_special(fd1, file1, skip1, fd2, file2, skip2); | ||||
return; | return; | ||||
} | } | ||||
dfound = 0; | dfound = 0; | ||||
tryfast = 1; | |||||
e1 = m1 + MMAP_CHUNK; | e1 = m1 + MMAP_CHUNK; | ||||
e2 = m2 + MMAP_CHUNK; | e2 = m2 + MMAP_CHUNK; | ||||
p1 = m1 + (skip1 - off1); | p1 = m1 + (skip1 - off1); | ||||
p2 = m2 + (skip2 - off2); | p2 = m2 + (skip2 - off2); | ||||
byte = line = 1; | |||||
for (byte = line = 1; length--; ++byte) { | while (length) { | ||||
if ((ch = *p1) != *p2) { | if (p1 == e1) { | ||||
if (xflag) { | |||||
dfound = 1; | |||||
(void)printf("%08llx %02x %02x\n", | |||||
(long long)byte - 1, ch, *p2); | |||||
} else if (lflag) { | |||||
dfound = 1; | |||||
(void)printf("%6lld %3o %3o\n", | |||||
(long long)byte, ch, *p2); | |||||
} else | |||||
diffmsg(file1, file2, byte, line); | |||||
/* NOTREACHED */ | |||||
} | |||||
if (ch == '\n') | |||||
++line; | |||||
if (++p1 == e1) { | |||||
off1 += MMAP_CHUNK; | off1 += MMAP_CHUNK; | ||||
if ((p1 = m1 = remmap(m1, fd1, off1)) == NULL) { | if ((p1 = m1 = remmap(m1, fd1, off1)) == NULL) { | ||||
munmap(m2, MMAP_CHUNK); | munmap(m2, MMAP_CHUNK); | ||||
err(ERR_EXIT, "remmap %s", file1); | err(ERR_EXIT, "remmap %s", file1); | ||||
} | } | ||||
e1 = m1 + MMAP_CHUNK; | e1 = m1 + MMAP_CHUNK; | ||||
} | } | ||||
if (++p2 == e2) { | if (p2 == e2) { | ||||
off2 += MMAP_CHUNK; | off2 += MMAP_CHUNK; | ||||
if ((p2 = m2 = remmap(m2, fd2, off2)) == NULL) { | if ((p2 = m2 = remmap(m2, fd2, off2)) == NULL) { | ||||
munmap(m1, MMAP_CHUNK); | munmap(m1, MMAP_CHUNK); | ||||
err(ERR_EXIT, "remmap %s", file2); | err(ERR_EXIT, "remmap %s", file2); | ||||
} | } | ||||
e2 = m2 + MMAP_CHUNK; | e2 = m2 + MMAP_CHUNK; | ||||
} | } | ||||
l = MIN(MIN(e1 - p1, e2 - p2), length); | |||||
if (c_chunk(file1, file2, p1, p2, l, &byte, &line, &tryfast)) | |||||
dfound = 1; | |||||
p1 += l; | |||||
p2 += l; | |||||
length -= l; | |||||
} | } | ||||
munmap(m1, MMAP_CHUNK); | munmap(m1, MMAP_CHUNK); | ||||
munmap(m2, MMAP_CHUNK); | munmap(m2, MMAP_CHUNK); | ||||
if (sigaction(SIGSEGV, &oact, NULL)) | if (sigaction(SIGSEGV, &oact, NULL)) | ||||
err(ERR_EXIT, "sigaction()"); | err(ERR_EXIT, "sigaction()"); | ||||
if (len1 != len2) | if (len1 != len2) | ||||
Show All 24 Lines |