Changeset View
Changeset View
Standalone View
Standalone View
usr.bin/cmp/regular.c
Show First 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | |||||
#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) | ||||
{ | { | ||||
struct sigaction act, oact; | struct sigaction act, oact; | ||||
cap_rights_t rights; | cap_rights_t rights; | ||||
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; | ||||
size_t len; | |||||
int dfound, tryfast; | |||||
off_t pagemask, off1, off2; | off_t pagemask, off1, off2; | ||||
size_t pagesize; | size_t pagesize; | ||||
int dfound; | |||||
if (skip1 > len1) | if (skip1 > len1) | ||||
eofmsg(file1); | eofmsg(file1); | ||||
len1 -= skip1; | len1 -= skip1; | ||||
if (skip2 > len2) | if (skip2 > len2) | ||||
eofmsg(file2); | eofmsg(file2); | ||||
len2 -= skip2; | len2 -= skip2; | ||||
Show All 27 Lines | c_regular(int fd1, const char *file1, off_t skip1, off_t len1, | ||||
sigemptyset(&act.sa_mask); | sigemptyset(&act.sa_mask); | ||||
act.sa_flags = SA_NODEFER; | act.sa_flags = SA_NODEFER; | ||||
act.sa_handler = segv_handler; | act.sa_handler = segv_handler; | ||||
if (sigaction(SIGSEGV, &act, &oact)) | if (sigaction(SIGSEGV, &act, &oact)) | ||||
err(ERR_EXIT, "sigaction()"); | err(ERR_EXIT, "sigaction()"); | ||||
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) { | len = MIN(MIN(e1 - p1, e2 - p2), length); | ||||
if (xflag) { | if (c_chunk(file1, file2, p1, p2, len, &line, &byte, &tryfast)) | ||||
dfound = 1; | dfound = 1; | ||||
(void)printf("%08llx %02x %02x\n", | length -= len; | ||||
(long long)byte - 1, ch, *p2); | if ((p1 += len) == e1 && length) { | ||||
} 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 += len) == e2 && length) { | ||||
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; | ||||
} | } | ||||
} | } | ||||
Show All 31 Lines |